C# Simulate VolumeMute press

半世苍凉 提交于 2019-12-22 06:49:39

问题


I got the following code to simulate volumemute keypress:

    [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);
    }

This code doesnt work. I know there's another way to mute/unmute sound by SendMessageW, but I dont want to use SendMessageW because I use KeyState to detect wheter I need to mute the sound or unmute the sound (if the user wants to unmute the sound and its already unmuted then I dont need to toggle - thats why I need to simulate VolumeMute keypress)

Thanks.


回答1:


The first reason it doesn't work is because you use the wrong DLL, coredll.dll is Windows Mobile. In the desktop version of Windows, keybd_event is exported by user32.dll. The second reason it doesn't work is because sending the keystroke isn't good enough. Not quite sure why, this seems to be intercepted before the generic input handler.

You can use WM_APPCOMMAND, it supports a range of commands and APPCOMMAND_VOLUME_MUTE is one of them. It acts as a toggle, turning muting on and off. Make your code look like this:

    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);
    }

This code needs to be inside a instance method of the form, note how it uses DefWndProc(). If you want to put it elsewhere then you need to fallback to SendMessage(). The actual window handle doesn't matter, as long as it is a valid toplevel one.



来源:https://stackoverflow.com/questions/4774768/c-sharp-simulate-volumemute-press

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!