C # Simulate VolumeMute нажмите - PullRequest
       46

C # Simulate VolumeMute нажмите

5 голосов
/ 23 января 2011

Я получил следующий код для имитации нажатия клавиши громкости:

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

Спасибо.

1 Ответ

7 голосов
/ 23 января 2011

Первая причина, по которой это не работает, заключается в том, что вы используете неправильную 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 ().Фактический дескриптор окна не имеет значения, если он является допустимым для верхнего уровня.

...