【问题标题】:C# Simulate VolumeMute pressC# 模拟 VolumeMute 按下
【发布时间】:2011-06-14 01:42:05
【问题描述】:

我得到以下代码来模拟音量静音按键:

    [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 善良是否有例外?
  • 没有错误。它只是不会静音..
  • @fardjad Windows 7 Ultimate 32bit

标签: c# .net keypress simulate mute


【解决方案1】:

它不起作用的第一个原因是因为你使用了错误的 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()。实际的窗口句柄无关紧要,只要它是有效的顶层句柄即可。

【讨论】:

  • 你给我的功能不模拟按键。它确实使声音静音,但不能模拟按键。但是,您的回答很有用,我从 coredll.dll 更改为 user32.dll 并使用了我的功能 - 它有效。谢谢。
  • 呃,它会静音。这不是重点吗?您可能要考虑在我的机器上,发送击键不起作用。其他人也观察到了这个问题,在 MSDN 论坛上有几个关于它的问题。众所周知,我发布的代码运行良好。
  • 它确实有效,就像我之前提到的那样。但我的观点是:我有 2 个按钮,1 个用于静音,1 个用于取消静音 - 可以说当前的声音状态是静音。我想取消静音,但使用你的解决方案,无论我按下哪个按钮 - 它们都做同样的事情......所以基本上我需要的是获得主音量的状态......
猜你喜欢
  • 1970-01-01
  • 2014-01-19
  • 1970-01-01
  • 2013-07-16
  • 2011-03-08
  • 1970-01-01
  • 2020-04-29
  • 2011-03-04
  • 2011-11-10
相关资源
最近更新 更多