我正在寻找以下问题的解决方案。我有 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;
您可能需要调整在枚举器函数中完成的过滤,具体取决于您要查找的确切内容(我并不完全清楚),但这可能会让您开始走上正确的轨道。