2010-11-12 4 views
4

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:

alt text

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!

Répondre

0

Ok, le premier problème que vous avez mentionné est facile à résoudre. Vous pouvez simplement appeler Refresh() lorsque vous retournez les fenêtres. Toutefois, si vous voulez dire qu'il y a un rectangle noir sur votre bureau principal et non une fenêtre, vous pouvez utiliser http://msdn.microsoft.com/en-us/library/bb776346(VS.85).aspx pour forcer l'actualisation de l'ensemble du bureau. Quant au second problème que vous rencontrez puisque vous êtes déjà en train de jouer avec la méthode Window Long, pourquoi ne pas simplement supprimer toutes les bordures, je crois que ce qui se passe est que la bordure peut avoir un "ThickFrame" que vous spécifiez dans votre retour méthodes, mais pas les méthodes de capture, ce qui explique pourquoi vous obtenez des barres d'outils et des bordures. Vous pouvez vérifier cela en appelant GetWindowLong stocker cette valeur et voir ce qu'il y a, de cette façon, vous pouvez savoir exactement ce qu'il faut supprimer. Bien que je ne suis pas sûr de ce que l'utilisation de cette application est. Je crois que ce que vous faites est peut-être la seule façon de le faire, puisque vous manipulez des écrans externes.

Questions connexes