3

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

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

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

4

5 回答 5

2

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

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

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

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

于 2008-09-18T07:30:18.317 回答
1

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

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

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

于 2008-09-18T07:50:06.863 回答
0

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

于 2008-09-18T06:13:33.943 回答
0

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

WM_MOUSEWHEEL = $020A;

如果您让 as 知道您使用的是哪种语言,这也会很有帮助。

于 2008-09-18T06:34:25.563 回答
0

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

于 2009-06-11T00:51:12.277 回答