【问题标题】:Find second window on given monitor在给定监视器上查找第二个窗口
【发布时间】:2015-01-14 09:48:07
【问题描述】:

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

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

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

任何帮助将不胜感激。

编辑

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

我有 2 台显示器,M1 和 M2,其中 M1 是我的主显示器。 有一个应用程序在运行,它总是在最上面,这是我自己制作的一个应用程序。

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

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

希望现在能更好地理解。

附:大卫明白了他最后评论的意思。

【问题讨论】:

  • 使用GetWindow 传递GW_HWNDFIRST 获取顶部窗口,然后使用GW_HWNDNEXT 向下移动z 顺序。
  • @DavidHeffernan 我看了看,但我不知道这在双显示器上是如何工作的,假设我有一个窗口集中在我的第二个显示器上,那不是我会得到的第二个吗?而我需要监视器 1 上的第二个窗口。
  • 您将获得所有显示器上的窗口。然后,您需要检查特定窗口是否在所需的监视器上。
  • @Teun 请edit你的问题,目前还不清楚。 “我有两台显示器,我想在那台显示器上找到第二个窗口。”您的问题中没有“那个监视器”。另外,“第二个窗口”是什么意思?
  • @JanDoggen 他想知道驻留在特定监视器上的哪个顶级窗口在 z 顺序中排在第二位。

标签: windows delphi


【解决方案1】:

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

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 函数中完成的过滤,具体取决于您要查找的确切内容(我并不完全清楚),但这可能会让您走上正确的道路。

【讨论】:

  • EnumWindows 是否枚举尊重 z 顺序?
  • 根据我在网上找到的,是的。例如,请参阅stackoverflow.com/questions/295996/…。然而,这并不能保证,但对于这里需要的用法,我认为可以做出这样的假设。
猜你喜欢
  • 2015-01-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-30
  • 1970-01-01
  • 2011-09-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多