gpt4 book ai didi

delphi - 检查当前事件窗口是否为桌面

转载 作者:行者123 更新时间:2023-12-03 15:47:18 29 4
gpt4 key购买 nike

我尝试检查当前事件窗口是否是桌面,执行某些操作,我在计时器中编写了以下代码,但 GetDektopWindow 和 GetForegroundWindow 返回的句柄值不是相同的值:

  if GetForegroundWindow = GetDesktopWindow then
// Do something

这是怎么做的?

最佳答案

// not defined in D2007
function GetShellWindow: HWND; stdcall; external user32;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
if GetForegroundWindow = GetShellWindow then
[..]
end;

使用我使用的唯一非资源管理器外壳(sharp),它失败了。

更新:

有时桌面的窗口层次结构是不同的(请参阅 Andreas 的评论)。下图是 Spy++ 在 Windows 7 的桌面图片旋转功能激活时拍摄的照片。一些“WorkerW”窗口占据了屏幕,并且是在桌面上单击时被激活的窗口。由于 GetShellWindow 返回“Progman 的句柄”,因此上述测试失败。

Spy++.png

此时,测试前景窗口是否将 shell 的默认 View 窗口作为其直接子窗口似乎是合理的,但是我看到多个引用表明多个“WorkerW”窗口可能会嵌套。所以我认为以下是一种更安全的方法:

procedure TForm1.Timer1Timer(Sender: TObject);

function HasDefViewChild(Wnd: HWND): Boolean;
begin
Result := Wnd <> 0;
if Result then begin
Result := FindWindowEx(Wnd, 0, 'SHELLDLL_DefView', nil) <> 0;
if not Result then
Result := HasDefViewChild(FindWindowEx(Wnd, 0, 'WorkerW', nil));
end;
end;

begin
if HasDefViewChild(GetForegroundWindow) then
[...]
end;

当前台窗口是“Progman”时,这将起作用,因为“DefView”是“Progman 的子窗口”。 OTOH,当“WorkerW”是事件窗口时,如果第一个子窗口不是“DefView”而又是另一个“WorkerW”,则代码将迭代。

关于delphi - 检查当前事件窗口是否为桌面,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4521499/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com