2008-09-18 60 views
2

我想擴展一個現有的應用程序,通過滾動滾動查看通知區域圖標來設置調音臺音量。如何使系統托盤(通知區域)圖標接收WM_MOUSEWHEEL消息?

據我所知,通知區域沒有收到任何WM_MOUSEWHEEL消息,但我仍然發現了一個應用程序,它完全符合我想要的(http://www.actualsolution.com/power_mixer)。 使用WinspectorSpy我注意到應用程序的窗體接收到一些奇怪的消息:0x000003d0和0x000003d1,但我沒有找到關於它們的引用。

有沒有人有任何想法如何我可以實現所需的功能?

回答

1

如果您想在應用程序之外捕獲鼠標/鍵盤事件,您將需要Low-level Hooks

關於在德爾福安裝鼠標鉤的一個很好的初學者文章是由Zarko Gajic在About.com上的How to Hook the Mouse to Catch Events Outside of your application

啓動應用程序的用戶需要管理權限才能安裝掛鉤。

在捕獲到消息之後,您應該確定它是否位於通知欄中的圖標之上(這可能很困難,因爲沒有確切的api來獲取您在柱上的位置)並且處理滾動事件。

0

不知道這是否會解決問題,但它可能是值得一試的起點。您可以創建頂層透明窗口,然後將其置於任務欄圖標的頂部。當鼠標懸停時,該頂級窗口將收到鼠標通知。您可以根據需要處理它們。如何找到任務欄圖標的屏幕位置是我不知道的,所以這可能是一個問題。

+0

這是一個有趣的方法,但恐怕我將不得不經常監視圖標的位置(出現另一個圖標,它被隱藏等)並重新定位透明窗口,這有點具有挑戰性。 – chitza 2008-09-19 20:24:55

0

標識不知道這是否會幫助你,但在Delphi中的標準信息數據庫狀態:

WM_MOUSEWHEEL = $ 020A;

如果您知道您正在使用哪種語言,這也會有所幫助。

+0

我在這個項目中使用Delphi,但問題是通知區域中的圖標沒有收到該消息。我仍然在尋找文章/博客,我看到了這個聲明。 – chitza 2008-09-19 20:13:55

+0

找到控件,它在獲取到控件之前攔截此消息,這可能是您的問題的答案。 – Drejc 2008-09-21 08:00:37

1

我解釋了有關鼠標掛鉤的問題,並提到可能很難找到您的確切圖標。我確實發現了以下關於如何找到托盤圖標的文章。

CTrayIconPosition - where is my tray icon?通過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 

使用這段代碼和上述文章的知識,我認爲你可以實現你想要的功能。

0

我以爲我會指出Power Mixer在整個任務欄上捕捉滾輪事件,而鼠標中鍵只在sys托盤圖標上運行。