Windows 在给定监视器上查找第二个窗口

Windows 在给定监视器上查找第二个窗口,windows,delphi,Windows,Delphi,我正在寻找以下问题的解决方案。 我有两个监视器,我想在某个监视器上找到第二个窗口 我需要第二个窗口的原因是,在这个监视器上,我有一个运行中的应用程序,它总是在顶部,我不需要那个窗口,所以后面的那个窗口 隐藏和显示最顶端不是一个选项,因为这会导致闪烁 任何帮助都将不胜感激 编辑 因为还不够清楚,我会尽量解释得更清楚一点 我有两个显示器,M1和M2,其中M1是我的主显示器。 有一个应用程序运行,将永远是最顶级的,这是一个应用程序,我自己做的 我想找到M1上最上面的窗口,但忽略我自己的应用程序。 那么

我正在寻找以下问题的解决方案。 我有两个监视器,我想在某个监视器上找到第二个窗口

我需要第二个窗口的原因是,在这个监视器上,我有一个运行中的应用程序,它总是在顶部,我不需要那个窗口,所以后面的那个窗口

隐藏和显示最顶端不是一个选项,因为这会导致闪烁

任何帮助都将不胜感激

编辑 因为还不够清楚,我会尽量解释得更清楚一点

我有两个显示器,M1和M2,其中M1是我的主显示器。 有一个应用程序运行,将永远是最顶级的,这是一个应用程序,我自己做的

我想找到M1上最上面的窗口,但忽略我自己的应用程序。 那么第二个呢

为了更清楚,您正在用delphi制作一个应用程序,当您调试表单时会弹出,但我要寻找的是返回RAD Studio的HWND,而不是您自己的表单

希望现在能更好地理解


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顺序枚举?根据我在网上的发现,是的。例如,见。然而,这并不能保证,但是对于这里需要的用法,我认为可以做出这样的假设。