【发布时间】:2021-07-26 11:17:47
【问题描述】:
我正在测试this code 示例(使用PrintWindow api)通过句柄捕获特定窗口,并看到捕获的窗口大于原始窗口(使用完整桌面捕获时)。是否有可能捕获与原始尺寸相同的窗口?
提前致谢。
版本:
例如,假设我想在 Internet Explorer 上捕获网站的正文:
var
Title: array [0 .. 255] of Char;
begin
GetWindowText(GetForegroundWindow, Title, 255);
if Title <> '' then
begin
if ContainsStr(string(Title), '- Internet Explorer') then
begin
WindowHandle := FindWindow(nil, PChar(string(Title)));
WindowHandle := FindWindowEx(WindowHandle, 0, 'Frame Tab', nil);
WindowHandle := FindWindowEx(WindowHandle, 0, 'TabWindowClass', nil);
WindowHandle := FindWindowEx(WindowHandle, 0, 'Shell DocObject View',
nil);
WindowHandle := FindWindowEx(WindowHandle, 0, 'Internet Explorer_Server', nil);
end;
end;
end;
然后使用链接答案的代码,IE 的第一个句柄将在屏幕截图上具有正确的大小,最后一个 (Internet Explorer_Server) 将被捕获大。我正在寻找一种方法来抵消屏幕截图的大小以不拉伸。
第 2 版:
我的目标是align remote mouse clicks on handle。确实,我已经有一个解决方案,就像您在我的last comment 中看到的那样,但是如果我只看到 gif 上显示的网站正文的屏幕截图和上面所说的,则此解决方案不起作用。然后我问屏幕截图的大小,因为我认为这可能是问题所在。
【问题讨论】:
-
仅供参考,您不需要
FindWindow(),因为您已经拥有来自GetForegroundWindow()的HWND。如果有多个 IE 窗口打开到同一个站点,则不能保证您的FindWindow()找到正确的窗口。 -
@RemyLebeau,我知道。但在 IE 上,如果您想通过网站主体上的句柄执行鼠标点击,则只能在类名为 Internet Explorer_Server 的句柄上执行。
-
我知道。我只指您的
FindWindow(nil, PChar(string(Title)))电话,而不是FindWindowEx()电话。您可以摆脱FindWindow()调用,只需将HWND从GetForegroundWindow()保存到您的WindowHandle变量,例如:WindowHandle := GetForegroundWindow(); GetWindowText(WindowHandle, Title, 255); ... WindowHandle := FindWindowEx(WindowHandle, ...); -
@RemyLebeau,请参阅我的第 2 版。
-
所以如果我理解正确的话,问题是屏幕截图在 F11 模式下会拉伸,对吗?我试图重现此(my code),当 IE 处于 F11 模式但 bmp 未拉伸时,我得到了更大的屏幕截图。
标签: delphi graphics screen-capture delphi-10.3-rio