Windows 在给定监视器上查找第二个窗口
我正在寻找以下问题的解决方案。 我有两个监视器,我想在某个监视器上找到第二个窗口 我需要第二个窗口的原因是,在这个监视器上,我有一个运行中的应用程序,它总是在顶部,我不需要那个窗口,所以后面的那个窗口 隐藏和显示最顶端不是一个选项,因为这会导致闪烁 任何帮助都将不胜感激 编辑 因为还不够清楚,我会尽量解释得更清楚一点 我有两个显示器,M1和M2,其中M1是我的主显示器。 有一个应用程序运行,将永远是最顶级的,这是一个应用程序,我自己做的 我想找到M1上最上面的窗口,但忽略我自己的应用程序。 那么第二个呢 为了更清楚,您正在用delphi制作一个应用程序,当您调试表单时会弹出,但我要寻找的是返回RAD Studio的HWND,而不是您自己的表单 希望现在能更好地理解Windows 在给定监视器上查找第二个窗口,windows,delphi,Windows,Delphi,我正在寻找以下问题的解决方案。 我有两个监视器,我想在某个监视器上找到第二个窗口 我需要第二个窗口的原因是,在这个监视器上,我有一个运行中的应用程序,它总是在顶部,我不需要那个窗口,所以后面的那个窗口 隐藏和显示最顶端不是一个选项,因为这会导致闪烁 任何帮助都将不胜感激 编辑 因为还不够清楚,我会尽量解释得更清楚一点 我有两个显示器,M1和M2,其中M1是我的主显示器。 有一个应用程序运行,将永远是最顶级的,这是一个应用程序,我自己做的 我想找到M1上最上面的窗口,但忽略我自己的应用程序。 那么
p.s.大卫最后一句话明白了我的意思。如果我理解你的问题是正确的,你可以这样使用女性:
TYPE
TEnumParm = RECORD
Monitor : TMonitor;
ZOrder : Cardinal;
Handle : HWND;
PUBLIC
CLASS FUNCTION Create(M : TMonitor ; Z : Cardinal) : TEnumParm; static;
PROCEDURE Initialize(M : TMonitor ; Z : Cardinal);
END;
PEnumParm = ^TEnumParm;
PROCEDURE TEnumParm.Initialize(M : TMonitor ; Z : Cardinal);
BEGIN
Monitor:=M; ZOrder:=Z; Handle:=0
END;
CLASS FUNCTION TEnumParm.Create(M : TMonitor ; Z : Cardinal) : TEnumParm;
BEGIN
Result.Initialize(M,Z)
END;
FUNCTION Enumerator(Handle : HWND ; Parm : PEnumParm) : BOOL; stdcall;
VAR
Rect : TRect;
BEGIN
Result:=GetWindowRect(Handle,Rect);
IF Result AND Parm^.Monitor.BoundsRect.IntersectsWith(Rect) THEN BEGIN
DEC(Parm^.ZOrder);
Result:=(Parm^.ZOrder>0);
IF NOT Result THEN Parm^.Handle:=Handle
END
END;
FUNCTION FindWindowOnMonitor(M : TMonitor ; ZOrder : Cardinal = 1) : HWND;
VAR
P : TEnumParm;
BEGIN
P.Initialize(M,ZOrder);
EnumWindows(@Enumerator,LPARAM(@P));
Result:=P.Handle
END;
您可能需要调整枚举器函数中完成的过滤,具体取决于您要查找的内容我并不完全清楚,但这可能会让您从正确的轨道开始。使用GetWindow passing GW_Hwnd First获得顶部窗口,然后GW_hwnd下一步向下移动z顺序。@DavidHeffernan我看了一下,但我不知道这在双监视器上是如何工作的,假设我有一个窗口聚焦在我的第二个监视器上,这不是我将得到的第二个监视器吗?而我需要监视器1上的第二个窗口。您将获得所有监视器上的窗口。然后,您需要检查所需显示器上是否有特定窗口。@t请回答您的问题,目前还不清楚。我有两个监视器,我想找到监视器上的第二个窗口。你的问题中没有“那个监视器”。还有,“第二个窗口”是什么意思?@Jandogen他想知道哪个位于特定监视器上的顶级窗口在z顺序中是第二个。EnumWindows是否按照z顺序枚举?根据我在网上的发现,是的。例如,见。然而,这并不能保证,但是对于这里需要的用法,我认为可以做出这样的假设。