【问题标题】:Drag and drop files/text to tray icon (C#, WindowsForms)将文件/文本拖放到托盘图标(C#、Windows 窗体)
【发布时间】:2011-04-25 00:18:41
【问题描述】:

我正在尝试允许拖放到我的应用程序上的托盘图标。

我知道 impossible 使用更高级别的 C# WindowsForms API 来执行此操作,因为 NotifyIcon 不支持拖动事件。

因此,在一位更有 Windows 经验的朋友的帮助下,我开始尝试通过 Win32 API 进行此操作。这个想法是在托盘窗口处理程序中注册一个钩子(在“SysPager”窗口处理程序上设置DragAcceptFiles(hWnd,TRUE); 之后)。

挂钩和掉落部分正在从托盘到DLL工作。

LRESULT CALLBACK myHookProc (int code, WPARAM wParam, LPARAM lParam){
  if (code == HC_ACTION)
  {
    PMSG msg = (PMSG) lParam;
    switch(msg->message){
      case WM_DROPFILES:
        ::MessageBox(NULL, L"Dropped files!", L"Test", MB_OK);
        // call my app's registered hook
        break;
  }
  return CallNextHookEx(oldHookProc, code, wParam, lParam);
}

正如预期的那样,我弹出了消息框。

问题是我现在需要在我的 C# (WindowsForms) 应用程序上调用一个函数来通知此事件。这是我遇到砖墙的地方。

当我在 DLL 中注册应用程序的回调时,我将其存储;但是当myHookProc被调用时,它的值为NULL。

原来我误解了 DLL 的工作原理;我的应用程序和托盘区域之间没有共享实例(它们被复制或者每个都有自己的“实例”,如果你可以调用它)所以我不能使用任何静态变量或类似的东西来保存回调引用回我的应用程序。

花了几个小时对此进行调查,唯一的解决方案似乎是共享内存(尝试了我在某个论坛中遇到的#pragma data_seg,但无济于事),但对于这种情况开始感觉太过分了一个“简单”的用例。

所以百万美元的问题是:

  1. 真的有必要将挂钩卸载到 DLL 吗?
  2. 我真的需要借助共享内存来完成此任务吗?
  3. (额外问题)WM_DROPFILES 仅适用于文件;如何为文本触发 drop 事件?

请记住,这是我第一次使用 .NET、C# 和 Win32(不到一周);解释原因的详细答案 - 而不仅仅是说明 - 将不胜感激!

谢谢。

【问题讨论】:

    标签: winapi dll drag-and-drop hook system-tray


    【解决方案1】:

    是的,您确实需要做这些事情,因为窗口属于另一个进程。全局挂钩需要一个可以注入的 DLL。完整的 D+D 支持需要 RegisterDragDrop 和 COM 代码。恶心的 COM 代码。

    不,你真的不应该这样做,因为其他人可能已经和你有同样的想法。并首先发布了他的程序。 MSFT 的 appcompat 团队一定是做噩梦了。小心Raymond Chen,他脾气暴躁。

    【讨论】:

    • 我知道这是一个坏主意,因为您提到的原因正是 - 其他人的应用程序可能会尝试做同样的事情,然后它就会变得一团糟。但是,这个项目 (codeproject.com/KB/cpp/DragnDropOnTrayIcon.aspx) 似乎能够找到特定的应用程序图标,如果它没有隐藏的话。有了这个,它仍然是一个坏主意吗?
    • 我已经对其进行了测试,它成功检测到您是否在图标上放置了一些东西,但是它总是在托盘上显示允许放置标志......无论如何,用户体验有点像对于 Windows 应用程序来说很奇怪......将一些东西拖到托盘上。
    • 奇怪的是,您通常不会在那里看到作者承认他无法使其工作的项目。很难看出这只不过是在浪费你的时间。
    • 我支持你。我将发布没有此功能的应用程序。如果我让很多人为此哭泣,我会再试一次:)
    猜你喜欢
    • 1970-01-01
    • 2011-04-30
    • 2012-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-21
    相关资源
    最近更新 更多