1)排行比较靠前的解决方案:http://www.qtcn.org /bbs/simple/?t48808.html 。这个在测试程序中是有效的。但是对我的应用不合适。因为该应用拥有不止一个通知栏图标(大部分应用应该不会这样)。MSG是 windows的消息,里面有窗口句柄。所以我一开始想只要知道通知栏图标的句柄,就可以知道是哪个通知栏图标获得此消息了。但是老问题又来了。 QSystemTrayIcon不是继承QWidget,不能获得winid。好吧,此路不通。
2)应该可行的解决方 案:http://svn.netlabs.org/repos/qt4/trunk/src/gui/util /qsystemtrayicon_win.cpp。 这是QSystemTrayIcon的源码(ps:很有学习的价值,看看人家怎么封装windows api的)。可以考虑在封装的时候,处理好鼠标enter/leave。我差点就这么动手搞了。不过继续Google,发现有个更简单的解决方案。
3) QSystemTrayIcon 有一个 geometry函数,介绍:Returns the geometry of the system tray icon in screen coordinates。 那就简单了,只要定时检查鼠标位置(我是用windows api GetCursorPos获取)是否在其中即可知道鼠标是否hover通知栏图标了。我设置成200ms检查一次,效果挺好的。