0

SendMessageW() 標準の方法を使用して、コンソール アプリから音量のミュートを解除しようとしています。ただし、explorer.exe ではなく、独自のアプリケーションをシェルとして実行しています。ミュートを解除しようとしても、何も起こりません。しかし、エクスプローラーを起動するとすぐに正常に動作します。メッセージを送信するには、エクスプローラーを実行する必要がありますか?
コード:

private const int APPCOMMAND_VOLUME_MUTE = 0x80000; 
private const int WM_APPCOMMAND = 0x319;
SendMessageW(Process.GetCurrentProcess().MainWindowHandle, WM_APPCOMMAND, Process.GetCurrentProcess().MainWindowHandle, (IntPtr)APPCOMMAND_VOLUME_MUTE);

からの戻り値SendMessageW()は 0 です
。Explorer が必要な場合、ミュートを解除する別の方法を知っている人はいますか?

サイドノート
vbsを使用して試しました:

Set WshShell = CreateObject("WScript.Shell")
WshShell.SendKeys(chr(&hAD))

そして、同じ結果を得ました。explorer.exe が実行されている場合にのみ、ミュートが解除されます。

4

2 に答える 2

5

SendMessageWは User32.DLL にある関数で、何をするかを指示するメッセージをアプリケーションに送信します。この場合、Explorer にメッセージを送信し、サウンドをミュートするように伝えます。このメッセージはSendMessageW、エクスプローラーが実行されているかどうかに関係なく送信されますが、独自のシェルを実行している場合、シェルはこのメッセージを処理するようにプログラムされておらず、単に無視されます。

できることは 2 つのうちの 1 つです。APPCOMMAND_VOLUME_MUTE最初のものは、メッセージが送信されたときにサウンドをミュートできるようにシェルに実装することです。2 つ目は、WinMM.dll ファイルを使用してサウンドをミュートし、代わりにここに投稿されたコードを使用してサウンドをミュートすることです (これは、ミュート コマンドを受け取った後、explorer.exe が行うことです)。

于 2012-05-03T21:59:52.283 に答える
2

ウィンドウは WM_APPCOMMAND 自体を処理できますが、ほとんど処理せず、DefWindowProc() に渡すだけです。次に、WH_SHELL フックを介してメッセージをシェルに配信します。シェルは、フックを初期化するために SetWindowsHookEx() を呼び出して、それらをリッスンする必要があります。HSHELL_APPCOMMAND 通知を含むコールバックを介して通知を取得します。

それはあなたです。

シェルになるのは簡単ではありません。

于 2012-05-04T00:17:03.443 に答える