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

StackOverflow https://stackoverflow.com/questions/90411

  •  01-07-2019
  •  | 
  •  

我想扩展我制作的现有应用程序,使其通过在通知区域图标上滚动滚轮来设置混音器音量。

据我所知,通知区域没有收到任何 WM_MOUSEWHEEL 消息,但我仍然找到了一个完全符合我想要实现的目标的应用程序(http://www.actualsolution.com/power_mixer)。使用 WinspectorSpy 我注意到应用程序的表单收到一些奇怪的消息:0x000003d0和0x000003d1,但我没有找到关于它们的参考资料。

有谁知道我如何实现所需的功能?

有帮助吗?

解决方案

如果您想在应用程序之外捕获鼠标/键盘事件,您将需要 低级钩子.

关于在 Delphi 中安装鼠标钩子的一篇不错的初学者文章是 如何挂钩鼠标以捕获应用程序外部的事件 在由 Zarko Gajic 撰写的 About.com 上。

启动应用程序的用户将需要管理权限才能安装挂钩。

捕获消息后,您应该确定它是否位于通知栏中图标的上方(这可能很困难,因为没有确切的 api 来获取您在通知栏上的位置),然后处理滚动事件。

其他提示

我解释了鼠标挂钩,并提到可能很难找到确切的图标。我确实找到了以下有关如何找到托盘图标的文章。

CTrayIconPosition - 我的托盘图标在哪里? 作者:艾雷克·齐林斯基。我认为如果您尝试了解它是如何工作的,您可以将其翻转并使用它来检查鼠标当前是否位于图标上方。

但您应该首先检查鼠标是否在托盘区域中。我找到了我的一些旧代码(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

使用这段代码和上述文章中的知识,我认为您可以实现您想要的功能。

不确定这是否能解决问题,但作为起点可能值得一试。您可以创建一个顶级透明窗口,然后将其放置在任务栏图标的顶部。当鼠标悬停在顶级窗口上时,该窗口将收到鼠标通知。然后您可以根据需要处理它们。我不知道如何找到任务栏图标的屏幕位置,因此这可能是一个问题。

我不知道这是否对您有帮助,但在 Delphi 中,标准消息库指出:

WM_MOUSEWHEEL = $020A;

如果您让他们知道您正在使用哪种语言,这也会很有帮助。

我只是想指出,Power Mixer 正在捕获整个任务栏上的滚轮事件,而鼠标中键单击仅在系统托盘图标上进行操作。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top