我尝试使用标准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运行时才取消静音。
答案 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通知通过回调获取通知。
那就是你。
成为贝壳并不容易。