gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 13:05:33 24 4
gpt4 key购买 nike

我开发了一个简单的 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

然后又回来了! :)

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

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

  • 其次,也是最重要的一点,有时当我捕获应用程序的窗口时,我也会捕获它的工具栏(尽管我提供的测量只是与窗口的视频区域相关的测量)。

有更好的方法吗?即使它只是更好的功能!记住:我要获取视频聊天应用程序的窗口,然后再返回。

提前感谢您的任何提示!

最佳答案

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

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

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

关于c# - 在 C# 中捕获应用程序窗口的最佳方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4164599/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com