由于在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);
得到顶层窗口,检查是否是前台窗口。
你试过了GetDesktopWindow吗? –
我想我没有。我可能弄错了,但我想我曾经读过ShellWindow是真正的桌面(自Win95以来的桌面),而DesktopWindow是之前已经可用的桌面,并且实际上存在于ShellWindow之后... – MFH
是的,你是对的,GetShellWindow是正确的。 http://blogs.microsoft.co.il/blogs/pavely/archive/2011/06/18/getshellwindow-vs-getdesktopwindow.aspx那么更改壁纸后,你会得到哪个过程窗口? –