在给定显示器上找到第二个窗口



我正在寻找以下问题的解决方案。我有 2 台显示器,我想在某个显示器上找到第二个窗口。

我需要第二个窗口的原因是,在该显示器上,我有一个正在运行的应用程序,该应用程序始终位于顶部,并且我不需要该窗口,因此之后的窗口。

隐藏和显示最上面的不是一种选择,因为这会导致闪烁。

任何帮助将不胜感激。

编辑

由于还不够清楚,我将尝试更好地解释它。

我有 2 台显示器,M1

和 M2,其中 M1 是我的主显示器。有一个正在运行的应用程序将永远是最重要的,这是我自己制作的应用程序。

我想在 M1 上找到最顶层的窗口,但忽略我自己的应用程序。所以第二个排队。

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

希望现在更好地理解。

附言大卫在他的最后一句话中明白了我的意思。

如果我理解你的问题是正确的,你可以像这样使用womething:

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;

您可能需要调整在枚举器函数中完成的过滤,具体取决于您要查找的确切内容(我并不完全清楚),但这可能会让您开始走上正确的轨道。

最新更新