如何使系统托盘(通知区域)图标接收WM_MOUSEWHEEL消息?

时间:2020-03-06 14:20:09  来源:igfitidea点击:

我想扩展现有的应用程序,使其通过滚动滚动通知区域图标来设置调音台音量。

据我所知,通知区域没有收到任何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托盘图标上起作用。