我尝试检查当前活动窗口是否是桌面做某事,我在下面的代码中写了一个计时器,但GetDektopWindow GetForegroundWindow的值不一样: if GetForegroundWindow = GetDesktopWindow then // Do something 这是怎么回事
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;
使用(sharpe)唯一的非资源管理器shell虽然失败了.
更新:
有时桌面的窗口层次结构是不同的(参见Andreas的评论).下面的镜头是Spy在Windows 7的桌面图片旋转功能被激活时所采取的措施.一些’WorkerW’窗口接管屏幕,它是在桌面上单击时被激活的窗口.由于GetShellWindow返回’Progman的句柄,因此上述测试失败.
此时测试前景窗口是否具有shell的默认视图窗口作为其直接子项似乎是合理的,但是我看到多个引用指示多个“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’代码,代码将迭代.