我想扩展我现有的应用程序,通过在其通知区域图标上滚动滚动来设置混音器音量。
据我所知,通知区域没有收到任何WM_MOUSEWHEEL消息,但我仍然找到了一个完全符合我要求的应用程序(http://www.actualsolution.com/power_mixer)。 使用WinspectorSpy我注意到应用程序表单收到的一些奇怪的消息:0x000003d0和0x000003d1,但我没有找到关于它们的引用。
有没有人知道如何实现所需的功能?
答案 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托盘图标上运行。