桌面图标操作 - 当启用带有图片旋转的主题时如何获取 SysListView32 的句柄
我正在尝试在桌面上移动图标,一切正常,直到选择具有图片旋转的主题。对于基本的 Windows 7 主题,SysListView32
是 SHELLDLL_DefView
的子级,而 SHELLDLL_DefView
又是 Progman
的子级。
但是,当选择图片旋转桌面主题时,SysListView32
会成为 SHELLDLL_DefView
的子级,而 SHELLDLL_DefView
又会成为 WorkerW
的子级。不止 1 个。我应该如何找到指向正确 WorkerW
的正确 HWND。枚举所有桌面窗口并使用类名 WorkerW 检查每个桌面窗口?
[DllImport("user32.dll", SetLastError = true)]
static extern IntPtr GetWindow(IntPtr hWnd, GetWindow_Cmd uCmd);
[DllImport("user32.DLL")]
public static extern IntPtr FindWindowEx(IntPtr hwndParent,IntPtr hwndChildAfter, string lpszClass, string lpszWindow);
[DllImport("user32.dll", SetLastError = true)]
static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
enum GetWindow_Cmd : uint
{
GW_HWNDFIRST = 0,
GW_HWNDLAST = 1,
GW_HWNDNEXT = 2,
GW_HWNDPREV = 3,
GW_OWNER = 4,
GW_CHILD = 5,
GW_ENABLEDPOPUP = 6
}
例如,在我的 main()
中,我进行以下调用:
IntPtr HWND = FindWindow("Progman",null);
HWND = GetWindow(HWND, GetWindow_Cmd.GW_CHILD);
HWND = GetWindow(HWND, GetWindow_Cmd.GW_CHILD);
I'm trying to move icons around the desktop, everything works well until a theme that has picture rotation is picked. With a basic Windows 7 theme, the SysListView32
is child of SHELLDLL_DefView
which is in turn child of Progman
.
But when a picture rotation desktop theme is picked, SysListView32
becomes child of SHELLDLL_DefView
which in turn becomes child of WorkerW
. There are more than 1. How should I go about finding the right HWND pointing to the right WorkerW
. Enumerate all desktop windows and check each one with a classname WorkerW?
[DllImport("user32.dll", SetLastError = true)]
static extern IntPtr GetWindow(IntPtr hWnd, GetWindow_Cmd uCmd);
[DllImport("user32.DLL")]
public static extern IntPtr FindWindowEx(IntPtr hwndParent,IntPtr hwndChildAfter, string lpszClass, string lpszWindow);
[DllImport("user32.dll", SetLastError = true)]
static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
enum GetWindow_Cmd : uint
{
GW_HWNDFIRST = 0,
GW_HWNDLAST = 1,
GW_HWNDNEXT = 2,
GW_HWNDPREV = 3,
GW_OWNER = 4,
GW_CHILD = 5,
GW_ENABLEDPOPUP = 6
}
In my main()
for example, I make the following calls:
IntPtr HWND = FindWindow("Progman",null);
HWND = GetWindow(HWND, GetWindow_Cmd.GW_CHILD);
HWND = GetWindow(HWND, GetWindow_Cmd.GW_CHILD);
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
非常感谢 Hans 在他的机器上尝试了这个,也感谢 Sertac 告诉我 SysListView32 将父级从“Progman”更改为“WorkerW”类名。我的解决方案是首先尝试在 Progman 的子级中找到 SysListView32:
如果 hwndIcon 返回 IntPtr.Zero,我尝试枚举桌面下的所有窗口,然后找到类名为“WorkerW”的窗口(我在委托 GetSysListViewContainer(.. .))在后者中,我找到了“唯一的一个”,即。有孩子的人。这是包含 SHELLDLL_DefView 的那个,它本身包含 SysListView32,它本身包含桌面上每个图标的句柄:
通过以下命令,我得到了桌面图标计数:
通过这个我循环了所有图标:
所以回顾一下,我需要找出为什么我无法获取所有桌面图标都存储在 Windows 中的列表视图容器的句柄。当没有背景旋转时,我的原始代码运行良好,但在有背景旋转时无法获取ListSysView32的句柄。
.Net 有没有更好的方法来做到这一点?
千焦
Big thanks to Hans for trying this on his machine, and for Sertac for clueing me that SysListView32 changes parents from "Progman" to the "WorkerW" classname. My solution was to first try to find the SysListView32 inside Progman's children:
if hwndIcon returns IntPtr.Zero, I try enumerating all windows under the desktop, then find those whose classname is "WorkerW" (I do this in the delegate GetSysListViewContainer(...)) Amongst the latter, I find "The One And Only One," ie. the one that has a child. That is the one that contains SHELLDLL_DefView, which itself contains SysListView32, which itself contains the handle of each Icon on the desktop:
With the following I get a desktop icon count:
And with this I loop through all icons:
So to recap, I needed to figure out why I couldn't get a handle for the listview container where all desktop icons are stored in Windows. The original code I had worked well when there was no background rotation, but failed to get the handle of ListSysView32 when there was.
Is there any better way to do this from .Net?
kj
这是获取
SysListView32
处理程序的丑陋而简单的方法(C++ 代码)This is the ugly and simple way to get a handler to a
SysListView32
(C++ code)