我正在尝试使用标准SendMessageW()
方法从控制台应用程序中取消音量静音。但是,我们有自己的应用程序作为 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))
并得到了相同的结果。仅当资源管理器.exe正在运行时,它才会取消静音。
SendMessageW
是 User32 中的一个函数.DLL它的作用是向应用程序发送一条消息,告诉它做某事。在这种情况下,您将向资源管理器发送一条消息并告诉它静音。无论资源管理器是否正在运行,此消息都由SendMessageW
发送,但是,如果您正在运行自己的 shell,则您的 shell 不会被编程为知道如何处理此消息,它只是忽略它。
您可以执行以下两项操作之一。第一种是在 shell 中实现APPCOMMAND_VOLUME_MUTE
,以便在发送消息时,它可以静音。第二种方法是使用 WinMM.dll 文件将声音静音,并使用此处发布的代码将声音静音(这是资源管理器.exe在收到 mute 命令后所做的)。
窗口可以自己处理WM_APPCOMMAND,但几乎从不这样做,它只是将其传递给DefWindowProc()。 然后,它通过WH_SHELL钩将消息传递到 shell。 shell 必须通过调用 SetWindowsHookEx() 来初始化钩子来侦听它们。 并通过带有HSHELL_APPCOMMAND通知的回调获取通知。
那就是你。
成为外壳并不容易。