システムトレイ (通知領域) アイコンに WM_MOUSEWHEEL メッセージを受信させるにはどうすればよいですか?
-
01-07-2019 - |
質問
作成した既存のアプリケーションを拡張して、通知領域のアイコンをホイールスクロールしてミキサーの音量を設定できるようにしたいと考えています。
私の知る限り、通知領域は WM_MOUSEWHEEL メッセージを受信しませんが、それでも私が達成したいことを正確に実行するアプリケーションを見つけました (http://www.actualsolution.com/power_mixer)。WinspectorSpy を使用していると、アプリケーションのフォームが受け取るいくつかの奇妙なメッセージに気づきました。0x000003d0 と 0x000003d1 ですが、それらに関するリファレンスは見つかりませんでした。
必要な機能を実現する方法について何かアイデアを持っている人はいますか?
解決
アプリケーションの外部でマウス/キーボード イベントをキャプチャしたい場合は、次のものが必要です。 低レベルのフック.
Delphi でのマウス フックのインストールに関する初心者向けの優れた記事は次のとおりです。 マウスをフックしてアプリケーションの外部のイベントをキャッチする方法 About.com で Zarko Gajic が執筆。
アプリケーションを起動するユーザーには、フックをインストールするための管理者権限が必要です。
メッセージをキャプチャしたら、それが通知バーのアイコンの上にあるかどうかを確認し (バー上の位置を取得する正確な 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 はタスク バー全体のスクロール ホイール イベントをキャプチャしているのに対し、マウスの中クリックはシステム トレイ アイコンのみで動作することを指摘しておきたいと思いました。