如果explorer.exe没有运行,可以使用SendMessageW(...)?

时间:2012-05-03 21:43:52

标签: c# message-queue explorer sendmessage

我尝试使用标准SendMessageW() method从控制台应用取消静音。但是,我们有自己的应用程序作为shell运行,而不是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 如果需要资源管理器,是否有人知道另一种取消静音方法?

旁注
我刚刚尝试使用vbs:

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

得到了相同的结果。只有在explorer.exe运行时才取消静音。

2 个答案:

答案 0 :(得分:5)

SendMessageW是User32.DLL中的一个函数,它的作用是向应用程序发送消息,告诉它执行某些操作。在这种情况下,您正在向Explorer发送消息并告诉它将声音静音。无论资源管理器是否正在运行,此消息都由SendMessageW发送,但是,如果您正在运行自己的shell,则您的shell无法编程知道如何处理此消息并且忽略它。 / p>

你可以做两件事之一。第一个是在shell中实现APPCOMMAND_VOLUME_MUTE,以便在发送消息时,它可以使声音静音。第二个是使用WinMM.dll文件静音,并使用code posted here来静音(这是explorer.exe在收到静音命令后执行的操作)。

答案 1 :(得分:2)

一个窗口可以处理WM_APPCOMMAND本身,但几乎从不这样做,它只是将它传递给DefWindowProc()。然后通过WH_SHELL挂钩将消息传递给shell。 shell必须通过调用SetWindowsHookEx()来初始化挂钩来监听它们。并使用HSHELL_APPCOMMAND通知通过回调获取通知。

那就是你。

成为贝壳并不容易。