加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

delphi – 检查是当前活动窗口桌面还是否

发布时间:2020-12-15 09:06:15 所属栏目:大数据 来源:网络整理
导读:我尝试检查当前活动窗口是否是桌面做某事,我在下面的代码中写了一个计时器,但GetDektopWindow GetForegroundWindow的值不一样: if GetForegroundWindow = GetDesktopWindow then // Do something 这是怎么回事? 解决方法 // not defined in D2007function
我尝试检查当前活动窗口是否是桌面做某事,我在下面的代码中写了一个计时器,但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;

使用(sharpe)唯一的非资源管理器shell虽然失败了.

更新:

有时桌面的窗口层次结构是不同的(参见Andreas的评论).下面的镜头是Spy在Windows 7的桌面图片旋转功能被激活时所采取的措施.一些’WorkerW’窗口接管屏幕,它是在桌面上单击时被激活的窗口.由于GetShellWindow返回’Progman的句柄,因此上述测试失败.

Spy++.png

此时测试前景窗口是否具有shell的默认视图窗口作为其直接子项似乎是合理的,但是我看到多个引用指示多个“WorkerW”窗口可能嵌套.所以我认为以下将是一种更加自动防范的方法:

procedure TForm1.Timer1Timer(Sender: TObject);

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

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

当前景窗口为’Progman’时,这将起作用,因为’DefView’是’Progman的孩子’. OTOH当’WorkerW’是活动窗口时,如果第一个孩子不是’DefView’而另一个’WorkerW’代码,代码将迭代.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读