3

作成した既存のアプリケーションを拡張して、通知領域のアイコンをホイールでスクロールしてミキサーの音量を設定できるようにしたいと考えています。

私の知る限り、通知領域は WM_MOUSEWHEEL メッセージを受け取りませんが、それでも私が達成したいことを正確に実行するアプリケーションを見つけました ( http://www.actualsolution.com/power_mixer )。WinspectorSpy を使用すると、アプリケーションのフォームが受け取るいくつかの奇妙なメッセージ (0x000003d0 および 0x000003d1) に気付きましたが、それらに関する参照は見つかりませんでした。

目的の機能をどのように実現できるかについて誰か考えがありますか?

4

5 に答える 5

2

アプリケーションの外部でマウス/キーボード イベントをキャプチャする場合は、低レベル フックが必要になります。

Delphi にマウス フックをインストールすることに関する初心者向けの優れた記事は、Zarko Gajic によって書かれた About.comの How to Hook the Mouse to Catch Events Outside of your application です。

アプリケーションを開始するユーザーには、フックをインストールするための管理者権限が必要です。

メッセージをキャプチャしたら、それが通知バーのアイコンの上にあるかどうかを判断し (バー上の位置を取得するための正確な API がないため、これは難しい場合があります)、スクロール イベントを処理する必要があります。

于 2008-09-18T07:30:18.317 に答える
1

マウスフックについて説明し、正確なアイコンを見つけるのは難しいかもしれないと述べました. トレイ アイコンの検索方法に関する次の記事を見つけました。

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

このコードと前述の記事の知識を使用して、必要な機能を実装できると思います。

于 2008-09-18T07:50:06.863 に答える
0

これで問題が解決するかどうかはわかりませんが、出発点として試してみる価値があるかもしれません。最上位の透明なウィンドウを作成して、タスクバー アイコンの上に配置することができます。その最上位ウィンドウは、マウスがその上にあるときにマウス通知を受け取ります。その後、必要に応じてそれらを処理できます。タスクバー アイコンの画面上の位置を見つける方法は私にはわからないので、問題になる可能性があります。

于 2008-09-18T06:13:33.943 に答える
0

これが役立つかどうかはわかりませんが、Delphi の標準メッセージ ライブラリには次のように記載されています。

WM_MOUSEWHEEL = $020A;

また、使用言語を教えていただけると助かります。

于 2008-09-18T06:34:25.563 に答える
0

Power Mixer はタスクバー全体でスクロール ホイール イベントをキャプチャしているのに対し、マウスの中クリックは sys トレイ アイコンだけで動作することを指摘しておきます。

于 2009-06-11T00:51:12.277 に答える