如何使systray(通知区域)图标接收WM_MOUSEWHEEL消息?

时间:2008-09-18 06:01:07

标签: winapi

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

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

有没有人知道如何实现所需的功能?

5 个答案:

答案 0 :(得分:1)

如果您想在应用程序之外捕获鼠标/键盘事件,则需要Low-level Hooks

关于在Delphi中安装鼠标钩子的一篇不错的初学者文章是由Zarko Gajic撰写的About.com上的How to Hook the Mouse to Catch Events Outside of your application

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

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

答案 1 :(得分:1)

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

Irek Zielinski的{p> CTrayIconPosition - where is my tray icon?。我想如果你试图了解它是如何工作的,你可以转过它并用它来检查你的鼠标当前是否位于你的图标上方。

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

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

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

WM_MOUSEWHEEL = $ 020A;

如果你知道你正在使用哪种语言,也会有所帮助。

答案 4 :(得分:0)

我想我会指出Power Mixer正在整个任务栏上捕捉滚轮事件,而鼠标中间点击只在sys托盘图标上运行。