如果资源管理器.exe未运行,则可以使用 SendMessageW(..)



我正在尝试使用标准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通知的回调获取通知。

那就是你。

成为外壳并不容易。

相关内容

最新更新