C#模拟按下音量静音键

5
我得到了以下代码来模拟音量静音按键:
```python import ctypes
VK_VOLUME_MUTE = 0xAD ctypes.windll.user32.keybd_event(VK_VOLUME_MUTE, 0, 0x0002, 0) ```
该代码使用Python调用Windows API模拟音量静音按键。
    [DllImport("coredll.dll", SetLastError = true)]
    static extern void keybd_event(byte bVk, byte bScan, int dwFlags, int dwExtraInfo);

    byte VK_VOLUME_MUTE = 0xAD;
    const int KEYEVENTF_KEYUP = 0x2;
    const int KEYEVENTF_KEYDOWN = 0x0;
    private void button1_Click(object sender, EventArgs e)
    {
            keybd_event(VK_VOLUME_MUTE, 0, KEYEVENTF_KEYDOWN, 0);
            keybd_event(VK_VOLUME_MUTE, 0, KEYEVENTF_KEYUP, 0);
    }

这段代码无法正常工作。我知道有另一种方法可以通过SendMessageW来静音/取消静音声音,但我不想使用SendMessageW,因为我使用KeyState来检测是否需要静音或取消静音(如果用户要取消静音,而它已经取消静音,则我不需要切换 - 这就是为什么我需要模拟VolumeMute按键操作)

谢谢。


当你说它不工作时,你是否从你的p-invoke代码中捕获到了异常? - dexter
没有错误。它只是无法静音声音。 - Ron
@fardjad Windows 7 终极版 32 位 - Ron
1个回答

8
第一个不起作用的原因是您使用了错误的DLL,coredll.dll是Windows Mobile的。在桌面版Windows中,keybd_event由user32.dll导出。第二个不起作用的原因是发送按键不够好。不太确定为什么,在通用输入处理程序之前似乎被拦截了。
您可以使用WM_APPCOMMAND,它支持一系列命令,其中APPCOMMAND_VOLUME_MUTE是其中之一。它充当开关,打开和关闭静音。将您的代码看起来像这样:
    private void button1_Click(object sender, EventArgs e) {
        var msg = new Message();
        msg.HWnd = this.Handle;
        msg.Msg = 0x319;              // WM_APPCOMMAND
        msg.WParam = this.Handle;
        msg.LParam = (IntPtr)0x80000; // APPCOMMAND_VOLUME_MUTE
        this.DefWndProc(ref msg);
    }

这段代码需要放在表单的实例方法中,注意它是如何使用DefWndProc()的。如果你想把它放在其他地方,那么你需要使用SendMessage()。实际的窗口句柄并不重要,只要它是一个有效的顶级窗口即可。


1
您给我的函数并没有模拟按键。它确实静音了声音,但没有模拟按键。不过,您的回答很有用,我从coredll.dll改为user32.dll并使用了我的函数——它起作用了。谢谢。 - Ron
嗯,它会静音。这不是整个目的吗?你可能需要考虑在我的机器上发送按键无法工作的问题。其他人也观察到了这个问题,在MSDN论坛上有几个相关的问题。我发布的代码已知能够很好地工作。 - Hans Passant
1
它确实可以工作,就像我之前提到的那样。但我的观点是:我有两个按钮,一个用于静音,一个用于取消静音 - 假设当前声音状态为静音。我想要取消静音,但使用您的解决方案,无论我按哪个按钮 - 它们都会执行相同的操作... 所以基本上我需要获取主音量的状态... - Ron

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接