gpt4 book ai didi

c# - 获取桌面/外壳窗口的句柄

转载 作者:可可西里 更新时间:2023-11-01 13:28:50 30 4
gpt4 key购买 nike

在我的一个程序中,我需要测试用户当前是否聚焦于桌面/shell 窗口。目前我正在使用 user32.dll 中的 GetShellWindow() 并将结果与​​ GetForegroundWindow() 进行比较。

这种方法在有人更改桌面墙纸之前一直有效,但是一旦更改了墙纸,GetShellWindow() 的句柄就不再与 GetForegroundWindow() 的句柄匹配,我不太明白为什么会这样。 (操作系统:Windows 7 32 位)

是否有更好的方法来检查桌面是否聚焦?如果用户更改壁纸,最好是不会损坏的?

编辑: 我设计了一个解决方法:我正在测试句柄是否有类“SHELLDLL_DefView”的子项。如果有,则桌面处于焦点位置。虽然它在我的电脑上工作,但这并不意味着它会一直工作......

最佳答案

事情发生了一点变化,因为在 Windows 7 中可以使用幻灯片作为墙纸。您对 WorkerW 是正确的,但这仅适用于设置为幻灯片效果的墙纸。

当设置壁纸模式为幻灯片时,您必须搜索类WorkerW 的窗口并检查 child 是否有SHELLDLL_DefView。如果没有幻灯片,您可以使用旧的 GetShellWindow()

几个月前我遇到了同样的问题,我写了一个函数来获取正确的窗口。不幸的是我找不到它。但以下应该有效。仅缺少 Win32 导入:

public enum DesktopWindow
{
ProgMan,
SHELLDLL_DefViewParent,
SHELLDLL_DefView,
SysListView32
}

public static IntPtr GetDesktopWindow(DesktopWindow desktopWindow)
{
IntPtr _ProgMan = GetShellWindow();
IntPtr _SHELLDLL_DefViewParent = _ProgMan;
IntPtr _SHELLDLL_DefView = FindWindowEx(_ProgMan, IntPtr.Zero, "SHELLDLL_DefView", null);
IntPtr _SysListView32 = FindWindowEx(_SHELLDLL_DefView, IntPtr.Zero, "SysListView32", "FolderView");

if (_SHELLDLL_DefView == IntPtr.Zero)
{
EnumWindows((hwnd, lParam) =>
{
if (GetClassName(hwnd) == "WorkerW")
{
IntPtr child = FindWindowEx(hwnd, IntPtr.Zero, "SHELLDLL_DefView", null);
if (child != IntPtr.Zero)
{
_SHELLDLL_DefViewParent = hwnd;
_SHELLDLL_DefView = child;
_SysListView32 = FindWindowEx(child, IntPtr.Zero, "SysListView32", "FolderView"); ;
return false;
}
}
return true;
}, IntPtr.Zero);
}

switch (desktopWindow)
{
case DesktopWindow.ProgMan:
return _ProgMan;
case DesktopWindow.SHELLDLL_DefViewParent:
return _SHELLDLL_DefViewParent;
case DesktopWindow.SHELLDLL_DefView:
return _SHELLDLL_DefView;
case DesktopWindow.SysListView32:
return _SysListView32;
default:
return IntPtr.Zero;
}
}

在您的情况下,您将调用 GetDesktopWindow(DesktopWindow.SHELLDLL_DefViewParent); 来获取顶级窗口以检查它是否是前景窗口。

关于c# - 获取桌面/外壳窗口的句柄,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8364758/

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