C#模拟VolumeMute按

我得到以下代码来模拟volumemute按键:

[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按键)

谢谢。

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