我目前正在使用WatiN,并发现它是一个非常好的网页浏览自动化工具。但是,在最近的版本中,它的屏幕捕捉功能似乎有所欠缺。我提出了一个可行的解决方案,可以从屏幕上捕获截图(独立生成类似于这个StackOverflow问题中的代码),并加入了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);
}
成功!我们获得了屏幕截图,但是有一个问题:hWndX
和hWndY
总是指向屏幕左上角,而不是我们想要复制的窗口位置。
然后我查看了一下Control.FromHandle
,但是它似乎只能用于你自己创建的窗体;如果你将hWnd
传递给它,该方法将返回一个空指针。
接着,进一步阅读让我改变了搜索标准......我一直在搜索“窗口位置”,但大多数人真正想要的是窗口的“位置”。这导致我找到了另一个SO问题,其中讨论了这个问题,但他们的答案是使用本机方法。
那么,只给定hWnd
,是否有一种本地 C# 方法可以找到窗口的位置(最好只使用 .NET 2.0 时代的库)?