J'ai développé une application Windows Forms simple pour capturer les fenêtres d'une application de chat vidéo (entrante, alias Remote, et outbound, alias Local). J'utilise du code API Windows non géré pour cela. Voici le code de capture:Quel est le meilleur moyen de capturer une fenêtre d'application en C#?
// Set Local Window
localHandle = FindWindow(null, "local");
// Backup parent window for local
prevLocalHandle = GetParent(localHandle);
SetParent(localHandle, this.pBoxLocal.Handle);
SetWindowLong(localHandle, GWL_STYLE, WS_VISIBLE + (WS_MAXIMIZE | WS_BORDER | WS_DISABLED));
MoveWindow(localHandle, 0, -TOP_BAR_HEIGHT, this.pBoxLocal.Width, this.pBoxLocal.Height + LOWER_BAR_HEIGHT, true);
// Set Remote Window
remoteHandle = FindWindow(null, "remote");
// Backup parent window for remote
prevRemoteHandle = GetParent(remoteHandle);
SetParent(remoteHandle, this.pBoxRemote.Handle);
SetWindowLong(remoteHandle, GWL_STYLE, WS_VISIBLE + (WS_MAXIMIZE | WS_BORDER | WS_DISABLED));
MoveWindow(remoteHandle, 0, -TOP_BAR_HEIGHT, this.pBoxRemote.Width, this.pBoxRemote.Height + LOWER_BAR_HEIGHT, true);
Voici le code de retour:
// Return Windows
SetParent(localHandle, prevLocalHandle);
SetWindowLong(localHandle, GWL_STYLE, (WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME | WS_MINIMIZEBOX | WS_MAXIMIZEBOX));
MoveWindow(localHandle, 0, 0, NORMAL_WIDTH, NORMAL_HEIGHT, true);
SetParent(remoteHandle, prevRemoteHandle);
SetWindowLong(remoteHandle, GWL_STYLE, (WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME | WS_MINIMIZEBOX | WS_MAXIMIZEBOX));
MoveWindow(remoteHandle, 0, 0, NORMAL_WIDTH, NORMAL_HEIGHT, true);
L'objectif est de passer de ceci:
à ceci:
Et puis de retour encore! :)
Il existe actuellement deux problèmes avec ma façon de faire les choses:
d'abord, quand je retourne les fenêtres à l'application de chat vidéo, ocasionally un rectangle noir est laissé sur mon top- coin gauche de l'écran. Il disparaît lorsque je rafraîchis la zone. Deuxièmement, et surtout, il y a des moments où quand je capture la fenêtre de l'application, je capture aussi ses barres d'outils (bien que les mesures que je fournis soient juste celles concernant la zone vidéo de la fenêtre).
Y a-t-il une meilleure façon de procéder? Même si c'est juste de meilleures fonctions! Rappelez-vous: je veux obtenir les fenêtres de l'application de chat vidéo et les retourner par la suite.
Merci d'avance pour tout conseils!