0

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。
如果需要 Explorer,是否有人知道另一种取消静音的方法?

旁注
我刚刚使用vbs尝试过:

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

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

4

2 回答 2

5

SendMessageW是在 User32.DLL 中找到的一个函数,它的作用是向应用程序发送一条消息,告诉它做某事。在这种情况下,您将向 Explorer 发送一条消息并告诉它静音。SendMessageW无论资源管理器是否正在运行,都会发送此消息,但是,如果您正在运行自己的 shell,则您的 shell 不会被编程为知道如何处理此消息并且它只是忽略它。

你可以做两件事之一。第一个是APPCOMMAND_VOLUME_MUTE在你的 shell 中实现,这样当消息被发送时,它可以静音。第二种是使用 WinMM.dll 文件静音,并使用此处发布的代码来静音(这是 explorer.exe 在收到静音命令后所做的)。

于 2012-05-03T21:59:52.283 回答
2

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

那是你。

成为壳并不容易。

于 2012-05-04T00:17:03.443 回答