我得到以下代码来模拟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()。实际的窗口句柄并不重要,只要它是有效的顶层句柄即可。
关于C#模拟VolumeMute按下,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4774768/