【问题标题】:How capture a window with correct dimensions?如何捕获具有正确尺寸的窗口?
【发布时间】: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() 调用,只需将HWNDGetForegroundWindow() 保存到您的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


【解决方案1】:

我发现了问题!碰巧在 1366x768 的屏幕分辨率下,句柄 Internet Explorer_Server 上的屏幕截图将是 1366x650,因此现在我必须根据此调整鼠标点击分辨率,而不是像以前那样在屏幕的原始分辨率 (1366x768) 上(链接问题)。

服务器:

X := Round((X * {ResolutionX}1366) / Image1.Width);
Y := Round((Y * {ResolutionY}650) / Image1.Height);

客户:

PostMessage(WindowHandle, WM_LBUTTONDOWN, MK_LBUTTON, MAKELPARAM(X, Y));
PostMessage(WindowHandle, WM_LBUTTONUP, MK_LBUTTON, MAKELPARAM(X, Y));

【讨论】:

  • 区别似乎是任务栏的大小。任务栏可以移动到屏幕的两侧,设置为自动隐藏或调整大小。测试使任务栏变大并位于左侧。
猜你喜欢
  • 2017-10-14
  • 1970-01-01
  • 2023-03-21
  • 2019-10-16
  • 1970-01-01
  • 2011-01-15
  • 1970-01-01
  • 1970-01-01
  • 2017-03-15
相关资源
最近更新 更多