自从Windows 7推出幻灯片壁纸后,事情有了一些改变。你提到的WorkerW是对的,但只适用于壁纸设置为幻灯片效果时。
当壁纸模式设置为幻灯片时,您需要搜索一个类为
WorkerW
的窗口,并检查子项中是否有
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);
来获取顶层窗口,以检查它是否为前台窗口。