托盘图标上的拖放
如何检测到项已拖放到特定托盘图标上

引言
如果你曾经想知道如何捕获托盘图标上的拖放事件,这篇文章可能会帮助你实现这个功能。在 CodeProject 的其他贡献的帮助下,我能够弄清楚大部分功能。我无法实现的一个事情是成功获取通常与 WM_DROPFILES
消息一起发送的 HDROP
结构。如果有人能在这方面帮助我,我将非常感激。请在这里发布,谢谢!
背景
那么,如何找到包含托盘图标的正确窗口呢?你可以使用 Visual Studio 附带的 Microsoft Spy++。查找名为 "Shell_TrayWnd
" 的窗口,其中包含另一个名为 "TrayNotifyWnd
" 的窗口,该窗口又包含另一个名为 "SysPager
" 的子窗口。 "SysPager
" 包含实际的包含所有图标的窗口,名为 "ToolbarWindow32
"。
HWND FindTrayToolbarWindow()
{
HWND hWnd = FindWindow("Shell_TrayWnd", NULL);
if(hWnd)
{
hWnd = FindWindowEx(hWnd,NULL,"TrayNotifyWnd", NULL);
if(hWnd)
{
hWnd = FindWindowEx(hWnd,NULL,"SysPager", NULL);
if(hWnd)
{
hWnd = FindWindowEx(hWnd, NULL,"ToolbarWindow32", NULL);
}
}
}
return hWnd;
}
找到窗口后,你需要确定正确的图标。这可以通过使用 POINT
发送到 WM_DROPFILES
并循环遍历所有图标来完成,这些图标实际上是按钮。这样,就可以确定你将文件拖放到哪个图标上。
Using the Code
代码分为两个文件。一个 EXE 文件代表托盘图标应用程序,一个消息钩子 DLL。 DLL 安装一个消息钩子来捕获 WM_DROPFILES
消息,并检查我们是否将任何内容拖放到我们的托盘图标上。然后,我将消息发送到属于我们托盘图标应用程序的窗口。
要运行代码,我建议在使用应用程序之前使用 dbgview
(在 zip 文件中)。我用它来捕获拖放操作期间的调试消息。
正如之前提到的,我仍然缺少从 WM_DROPFILES
消息中获取指向 HDROP
结构的指针的部分。不知何故,即使它应该包含该指针,该消息也不包含它。如果有人能弄清楚那里有什么问题,我会非常高兴的。
参考文献
历史
- 2007-08-07 初始发布