如何使系统托盘(通知区域)图标接收WM_MOUSEWHEEL消息?
我想扩展现有的应用程序,使其通过滚动滚动通知区域图标来设置调音台音量。
据我所知,通知区域没有收到任何WM_MOUSEWHEEL消息,但是我仍然找到了一个可以实现我想要实现的功能的应用程序(http://www.actualsolution.com/power_mixer)。
使用WinspectorSpy,我注意到应用程序的表单收到一些奇怪的消息:0x000003d0和0x000003d1,但是我没有找到关于它们的引用。
有人对我如何实现所需的功能有任何想法吗?
解决方案
不知道这是否可以解决问题,但是作为一个起点可能值得尝试。我们可以创建一个顶层透明窗口,然后将其放置在任务栏图标上方。当鼠标悬停在该顶层窗口上时,它将收到鼠标通知。然后,我们可以根据需要对其进行处理。我不知道如何找到任务栏图标的屏幕位置,因此可能是个问题。
我不知道这是否对我们有帮助,但是在Delphi中,标准消息库指出:
WM_MOUSEWHEEL = $ 020A;
如果让我们知道所使用的语言,这也将很有帮助。
如果要在应用程序之外捕获鼠标/键盘事件,则需要使用低级挂钩。
关于在Delphi中安装鼠标挂钩的不错的初学者文章是Zarko Gajic在About.com上的应用程序外部如何挂钩鼠标以捕获事件。
启动应用程序的用户将需要管理权限才能安装挂钩。
捕获消息后,我们应该确定消息是否位于通知栏中的图标上方(这很困难,因为没有确切的api来获取我们在栏中的位置),然后处理滚动事件。
我解释了有关鼠标钩的问题,并提到可能很难找到确切的图标。我确实找到了以下有关如何找到任务栏图标的文章。
CTrayIconPosition我的任务栏图标在哪里?由Irek Zielinski撰写。我认为,如果我们尝试了解它的工作原理,则可以将其旋转并使用它来检查鼠标当前是否位于图标上方。
但是,我们首先应该检查鼠标是否在托盘区域中。我发现了我的一些旧代码(2005),可以找到正确的区域。
var hwndTaskBar, hwndTrayWnd, hwndTrayToolBar : HWND; rTrayToolBar : tRect; begin hwndTaskBar := FindWindowEx (0, 0, 'Shell_TrayWnd', nil); hwndTrayWnd := FindWindowEx (hwndTaskBar , 0, 'TrayNotifyWnd',nil); hwndTrayToolBar := FindWindowEx(hwndTrayWnd, 0, 'ToolbarWindow32',nil); Windows.GetClientRect(hwndTrayToolBar, rTrayToolBar); end
我认为,使用这段代码和所提到文章的知识,我们可以实现所需的功能。
只是以为我要指出,Power Mixer捕获了整个任务栏上的滚轮事件,而鼠标中键仅在sys托盘图标上起作用。