在给定的监视器上找到第二个窗

时间:2015-01-14 09:48:07

标签: windows delphi

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

我需要第二个窗口的原因是因为在那个监视器上我有一个正在运行的应用程序,它始终在顶部,我不需要那个窗口,所以那之后。

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

非常感谢任何帮助。

修改

由于不够明确,我会尝试更好地解释它。

我有2台显示器,M1和M2,其中M1是我的主显示器。 有一个应用程序运行始终是最顶层的,这是我自己创建的一个应用程序。

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

为了更清晰,你在delphi中创建一个应用程序,当你调试时,你的表单会弹出,但我要找的是返回RAD Studio的HWND而不是你自己的表格。

希望现在能更好地理解。

P.S。大卫在最后的评论中得到了我的意思。

1 个答案:

答案 0 :(得分:0)

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

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;

您可能需要调整Enumerator功能中完成的过滤,具体取决于您正在寻找的具体内容(对我来说并不完全清楚),但这可能会让您开始走上正确的轨道