由於在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那麼更改壁紙後,你會得到哪個過程窗口? –