2012-05-03 6 views
0

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

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); 

戻り値が0
で、誰もがミュート解除の別の方法を知っていますか?

側注は
私はvbsファイルを使用して、それを試してみました:

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

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

答えて

5

SendMessageWは、User32.DLLにある関数で、何かをするように指示するメッセージをアプリケーションに送信します。この場合、エクスプローラにメッセージを送信し、サウンドをミュートするように指示しています。このメッセージは、エクスプローラが実行されているかどうかにかかわらず、SendMessageWによって送信されます。ただし、独自のシェルを実行している場合、シェルはこのメッセージの処理方法を知り、無視します。

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

2

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

あなたです。

シェルになることは容易ではありません。

関連する問題