我目前正在使用 WatiN,并发现它是一个很棒的网页浏览自动化工具。但是,截至上一个版本,它的屏幕捕获功能似乎有所欠缺。除了Charles Petzold 的一些代码之外,我还提出了一个可行的解决方案,用于从屏幕上捕获屏幕截图(独立生成类似于此 StackOverflow 问题的代码) 。不幸的是,缺少一个组件:实际的窗口在哪里?
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);
}
成功!我们得到了屏幕截图,但有一个问题:总是指向屏幕的最左上角,而不是我们要从中复制的窗口的位置 hWndX
。hWndY
然后我调查了Control.FromHandle
,但这似乎只适用于您创建的表单;如果您将 传递给该方法,则此方法将返回一个空指针hWnd
。
然后,进一步阅读导致我切换搜索条件......当大多数人真正想要窗口的“位置”时,我一直在搜索“窗口位置”。这导致另一个 SO question谈到了这一点,但他们的答案是使用本机方法。
那么,只有给定 hWnd (最好只有 .NET 2.0 时代的库),是否有一种本地 C# 方法来查找窗口的位置?