如何在C#中捕获应用程序窗口?

4

我开发了一个简单的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. 首先,当我将窗口返回到视频聊天应用程序时,屏幕左上角会留下一个黑色矩形。当我刷新该区域时,它会消失。 2. 最重要的是,有时候当我捕获应用程序的窗口时,我也会捕获其工具栏(尽管我提供的测量值只涉及窗口的视频区域)。
有更好的方法吗?即使只是更好的函数!请记住:我想获取视频聊天应用程序的窗口,并在之后返回它们。
感谢您提供的任何提示!
1个回答

0

好的,你提到的第一个问题很容易解决。当你返回窗口时,你可以调用Refresh()。但是如果你指的是主桌面上出现了黑色矩形而不是窗口,那么你可以使用http://msdn.microsoft.com/en-us/library/bb776346(VS.85).aspx,它将允许你强制刷新整个桌面。

至于你提到的第二个问题,既然你已经在操作Window Long方法,为什么不直接移除所有边框呢?我认为可能发生的情况是边框可能有一个"ThickFrame",你在返回方法中指定了它,但没有在捕获方法中指定,这可能是为什么你会得到工具栏和边框的原因。你可以通过调用GetWindowLong来检查这一点,存储该值并查看其中的内容,这样你就可以知道要删除什么。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接