gpt4 book ai didi

c# - 在没有 NativeMethods 的情况下,如何找到给定 hWnd 的窗口的位置/位置?

转载 作者:可可西里 更新时间:2023-11-01 07:49:37 29 4
gpt4 key购买 nike

我目前正在使用 WatiN,发现它是一个很棒的 Web 浏览自动化工具。但是,截至上一个版本,它的屏幕捕获功能似乎有所欠缺。除了一些 this StackOverflow question 之外,我已经想出了一个可行的解决方案来从屏幕上捕获屏幕截图(独立生成类似于 code by Charles Petzold 的代码) .不幸的是,缺少一个组件:实际窗口在哪里

WatiN 方便地向您提供浏览器的 hWnd,因此我们可以(通过这个简化的示例)设置为从屏幕复制图像,如下所示:

// browser is either an WatiN.Core.IE or a WatiN.Core.FireFox...
IntPtr hWnd = browser.hWnd;
string filename = "my_file.bmp";
using (Graphics browser = Graphics.FromHwnd(browser.hWnd) )
using (Bitmap screenshot = new Bitmap((int)browser.VisibleClipBounds.Width,
(int)browser.VisibleClipBounds.Height,
browser))
using (Graphics screenGraphics = Graphics.FromImage(screenshot))
{
int hWndX = 0; // Upper left of graphics? Nope,
int hWndY = 0; // this is upper left of the entire desktop!

screenGraphics.CopyFromScreen(hWndX, hWndY, 0, 0,
new Size((int)browser.VisibileClipBounds.Width,
(int)browser.VisibileClipBounds.Height));
screenshot.Save(filename, ImageFormat.Bmp);
}

成功了!我们得到了屏幕截图,但是有一个问题:hWndXhWndY 总是指向屏幕的最左上角,而不是我们要从中复制的窗口的位置。

然后我查看了 Control.FromHandle,但这似乎只适用于您创建的表单;如果您将 hWnd 传递给此方法,此方法将返回一个空指针。

然后,进一步的阅读让我改变了我的搜索标准……当大多数人真正想要窗口的“位置”时,我一直在搜索“窗口的位置”。这导致 another SO question说到这个,但他们的答案是使用本地方法。

那么,是否存在仅给定 hWnd(最好只使用 .NET 2.0 时代的库)来查找窗口位置的 native C# 方法?

最佳答案

我刚刚在一个项目中经历了这个,但无法找到任何托管的 C# 方式。

要添加到 Reed 的答案中,P/Invoke 代码是:

 [DllImport("user32.dll", SetLastError = true)]
[return: MarshalAs(UnmanagedType.Bool)]
static extern bool GetWindowRect(IntPtr hWnd, ref RECT lpRect);
[StructLayout(LayoutKind.Sequential)]
private struct RECT
{
public int Left;
public int Top;
public int Right;
public int Bottom;
}

称它为:

  RECT rct = new RECT();
GetWindowRect(hWnd, ref rct);

关于c# - 在没有 NativeMethods 的情况下,如何找到给定 hWnd 的窗口的位置/位置?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1434524/

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