Delphi 如何捕获具有正确尺寸的窗口?

Delphi 如何捕获具有正确尺寸的窗口?,delphi,graphics,screen-capture,delphi-10.3-rio,Delphi,Graphics,Screen Capture,Delphi 10.3 Rio,例如,我正在测试(使用api)通过句柄捕获特定窗口,发现捕获的窗口大于原始窗口(使用完整桌面捕获时)。是否有可能捕捉到与原始尺寸相同的窗口 提前谢谢 版本: 例如,我希望在Internet Explorer上捕获站点正文: var Title: array [0 .. 255] of Char; begin GetWindowText(GetForegroundWindow, Title, 255); if Title <> '' then begin if

例如,我正在测试(使用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;
var
标题:字符的数组[0..255];
开始
GetWindowText(GetForegroundWindow,标题,255);
如果标题为“”,则
开始
如果包含str(字符串(标题),'-internetexplorer'),则
开始
WindowHandle:=FindWindow(nil,PChar(字符串(标题));
WindowHandle:=FindWindowEx(WindowHandle,0,'Frame Tab',nil);
WindowHandle:=FindWindowEx(WindowHandle,0,'TabWindowClass',nil);
WindowHandle:=FindWindowEx(WindowHandle,0,“Shell DocObject视图”,
零);
WindowHandle:=FindWindowEx(WindowHandle,0,'internetexplorer\u Server',nil);
结束;
结束;
结束;
然后使用链接答案的代码,IE的第一个句柄将在屏幕截图上显示正确的大小,最后一个(Internet Explorer_服务器)将被捕获。我正在搜索一种方法,以抵消屏幕截图的大小,使其不会拉伸


第二版:


我的目标是。确实,我已经有了一个解决方案,你们可以在我的中看到,但这个解决方案不起作用,如果我看到的只是网站主体的截图,如gif上所示,如上所述。然后我问屏幕截图的大小,因为我想这可能就是问题所在。

我发现了问题!。恰巧在屏幕分辨率为1366x768的情况下,handle Internet Explorer_服务器上的屏幕截图将为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));

仅供参考,您不需要
FindWindow()
,因为您已经拥有
getforegroundindow()中的
HWND
。如果有多个IE窗口打开到同一个站点,您的
FindWindow()
不能保证找到正确的窗口。@RemyLebeau,我知道。但在IE上,若你们想通过网站主体上的手柄来执行鼠标点击,那个么只有在手柄上才有可能,其中的类名是InternetExplorer\u服务器。我知道这一点。我只是指你的
FindWindow(nil,PChar(string(Title))
调用,而不是
FindWindowEx()
调用。您可以摆脱该
FindWindow()
调用,只需将
HWND
getforegroughindow()
保存到
WindowHandle
变量,例如:
WindowHandle:=getforegroughindow();GetWindowText(WindowHandle,标题,255)。。。WindowHandle:=FindWindowEx(WindowHandle,…)
@RemyLebeau,请看我的第二版。如果我理解正确,问题是在F11模式下屏幕截图会拉伸,对吗?我试图复制这个(),当IE处于F11模式时,我得到了一个更大的屏幕截图,但是bmp没有拉伸。区别看起来是任务栏的大小。任务栏可以移动到屏幕两侧,设置为自动隐藏或调整大小。要测试,请使任务栏变大并位于左侧。