65.9K
CodeProject 正在变化。 阅读更多。
Home

托盘图标上的拖放

starIconstarIcon
emptyStarIcon
starIcon
emptyStarIconemptyStarIcon

2.80/5 (4投票s)

2007年8月7日

CPOL

2分钟阅读

viewsIcon

55126

downloadIcon

910

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

Screenshot - desktop.jpg

引言

如果你曾经想知道如何捕获托盘图标上的拖放事件,这篇文章可能会帮助你实现这个功能。在 CodeProject 的其他贡献的帮助下,我能够弄清楚大部分功能。我无法实现的一个事情是成功获取通常与 WM_DROPFILES 消息一起发送的 HDROP 结构。如果有人能在这方面帮助我,我将非常感激。请在这里发布,谢谢!

背景

那么,如何找到包含托盘图标的正确窗口呢?你可以使用 Visual Studio 附带的 Microsoft Spy++。查找名为 "Shell_TrayWnd" 的窗口,其中包含另一个名为 "TrayNotifyWnd" 的窗口,该窗口又包含另一个名为 "SysPager" 的子窗口。 "SysPager" 包含实际的包含所有图标的窗口,名为 "ToolbarWindow32"。

Screenshot - MSSpy__.jpg

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 初始发布
© . All rights reserved.