在C#中捕获应用程序窗口的最佳方法是什么?

时间:2010-11-12 12:28:38

标签: c# winapi unmanaged

我开发了一个简单的Windows窗体应用程序来捕获视频聊天应用程序的窗口(入站,即远程和出站,又称本地)。 我为此使用非托管Windows API代码。这是捕获代码:

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

对此:

alt text

然后又回来了! :)

目前我的做事方式存在两个问题:

  • 首先,当我将窗口返回到视频聊天应用程序时,屏幕的左上角偶尔会出现一个黑色矩形。当我刷新该区域时它会消失。

  • 第二,也是最重要的,有时候当我捕捉应用程序的窗口时,我也会捕获它的工具栏(虽然我提供的测量只是关于窗口视频区域的测量)。

有更好的方法吗?即使它的功能更好!请记住:我想获取视频聊天应用程序的窗口并在之后返回它们。

提前感谢任何提示!

1 个答案:

答案 0 :(得分:0)

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

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

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

相关问题