以编程方式单击托盘中的菜单项

时间:2012-08-02 14:03:48

标签: winapi tray

我正在编写一个应用程序,我需要从另一个应用程序的托盘图标菜单中单击一个菜单项。这是一个更好理解的截图,因为我不好解释一些东西。 Screenshot example
所以我需要单击其中一个菜单项,例如“退出”。

我知道我应该使用WinApi来做到这一点。但是,据我所知,消息WM_NOTIFY负责通知顶部窗口有关菜单项单击的信息。正如MSDN网站所说,For Windows 2000 and later systems, the WM_NOTIFY message cannot be sent between processes。我想运行我的应用程序的PC运行Windows XP,所以我无法将此消息发送到窗口。有没有其他方法可以点击菜单项?

提前致谢。

1 个答案:

答案 0 :(得分:3)

您的解决方案很可能是针对特定应用的。托盘图标菜单的应用程序通常做的是注册图标并为通知提供自己的窗口句柄HWND,其中Windows shell将转发鼠标事件。单击图标后,窗口会收到转发的偶数并使用TrackPopupMenu API显示菜单,并且 - 运气好 - 请求将所选菜单项标识符发回某个窗口,可能是同一个窗口,如WM_COMMAND消息/通知。

因此,您基本上需要的是监视您感兴趣的应用程序,当您单击菜单时,在其进程或线程中生成哪些消息。 Spy++是一个很好的工具。一旦您看到由于托盘图标上下文菜单项选择而在某个窗口中发布了特定消息(命令),您在控制应用程序中所需要的就是找到此窗口,即找到其HWND名称,进程名称,然后向其发送WM_COMMAND消息。

这不能保证有效,因为我们对应用程序方面的菜单实现方式做了一些假设,但是按照上述策略进行研究是有意义的。

UPD。我的华硕EEE PC上网本附带Asus实用程序,可通过系统托盘图标和菜单切换显示器分辨率。默认分辨率对我不好。 This small app posted a command此实用程序可自动更改分辨率。