2010-11-12 128 views
4

我开发了一个简单的Windows窗体应用程序来捕获视频聊天应用程序(入站,又名远程和出站,又名本地)的窗口。 我为此使用了非托管Windows API代码。这里是捕捉代码:在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); 

这里是返回代码:

// 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); 

的目标是从这个去:

要这样:

alt text

然后回来又来了! :)

目前有两个问题与我的处事方式:

  • 首先,当我返回窗口视频聊天应用,ocasionally一个黑色的矩形留在我顶屏幕左上角。刷新区域时消失。我也捕获了它的工具栏(虽然我提供的测量结果只是关于窗口视频区域的测量结果),但是有时候我捕捉应用程序的窗口。

有没有更好的方法来做到这一点?即使它只是更好的功能!请记住:我想获取视频聊天应用程序的窗口,然后返回。

在此先感谢您的任何提示!

回答

0

好吧,你说的第一个问题是一个容易解决的问题。您可以在返回窗口时调用Refresh()。但是,如果你的意思是你的主桌面上有一个黑色的矩形而不是一个窗口,那么你可以使用http://msdn.microsoft.com/en-us/library/bb776346(VS.85).aspx这将允许你强制整个桌面刷新。

至于你遇到的第二个问题,你已经搞乱了Window Long方法,为什么不只是删除所有边框,我相信可能发生的是边框可能有一个“ThickFrame”,你在你的返回中指定方法但不捕获方法,这可能是为什么你得到工具栏和边界。您可以通过调用GetWindowLong来存储该值并查看其中的内容来检查该内容,这样您就可以确切知道要删除的内容。

虽然我不确定这个应用程序的用途是什么。我相信你正在做的事可能是唯一的办法,因为你在操纵外部屏幕。

相关问题