【问题标题】:Order at which my icon is added to the system tray?我的图标添加到系统托盘的顺序是什么?
【发布时间】:2014-05-21 19:54:41
【问题描述】:

我正在编写一个 MFC/C++ 应用程序,它在系统托盘上放置了几个图标。 (图标的数量由用户控制,如果用户愿意,最多可以达到 10 个左右——每个图标的数量取决于应用程序的特定功能。)

我的问题是,我可以控制这些图标在托盘上的放置顺序吗?

现在发生的事情是当我打电话时

Shell_NotifyIcon(NIM_ADD, &nid);

按照一定的顺序,图标在实际托盘中出现的顺序是不同的。

【问题讨论】:

  • 我很想被证明是错误的,但我认为这是不可能的。为什么要首先添加 10 个图标?菜单或其他东西不是更有意义吗?
  • @Thomas:好的。这显然回答了我的问题。谢谢。
  • 您无法控制图标的显示顺序。
  • 刚学到东西。事实证明,用户可以用鼠标拖动托盘图标来更改它们的顺序。适用于 Windows 7 及更高版本。

标签: c++ windows mfc system-tray trayicon


【解决方案1】:

任务托盘只是一个 ToolBar32 控件。您可以通过以下方式处理它:

HWND hWnd = ::FindWindow(_T("Shell_TrayWnd"), NULL);
if(hWnd)
{
    hWnd = ::FindWindowEx(hWnd,NULL,_T("TrayNotifyWnd"), NULL);
    if(hWnd)
    {
        hWnd = ::FindWindowEx(hWnd,NULL,_T("SysPager"), NULL);
        if(hWnd)
        {                
            hWnd = ::FindWindowEx(hWnd, NULL,_T("ToolbarWindow32"), NULL);
        }
    }
}

那么你应该可以这样调用:

::SendMessage(hWnd, TB_MOVEBUTTON, nFrom, nTo);

【讨论】:

  • 我真的可以将TB_MOVEBUTTON 发送到不在我的进程中的窗口吗?
  • 您依赖的实施细节随时可能发生变化。
  • @c00000fd:是的,因为您只是在消息参数中直接传递整数值,而不是依赖于任何特定进程地址空间的指针。
  • @RaymondChen:理论上是正确的,但对于任何给定的版本都不会改变。 OP 仍然应该在每个操作系统上对其进行测试,并可能根据您运行的版本进行调整。例如,如果使用 Metro Skin 运行 Win8+,这将没有多大用处。
  • 任何 Windows 更新都可以更改它。而且目前还不清楚 OP 如何在 Windows 10 上进行测试,因为它还不存在。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-11
  • 1970-01-01
  • 1970-01-01
  • 2011-04-16
  • 2011-06-25
相关资源
最近更新 更多