VolumeMute KeyPress - невозможно отменить событие после обработки

У меня есть приложение С#, которое отслеживает нажатия клавиш с помощью событий KeyDown и KeyPress. В частности, он отслеживает нажатие клавиши VolumeMute (с портативного устройства) для выполнения специальной обработки. Он отлично работает с одной проблемой: кажется, что Windows перехватывает нажатие клавиши VolumeMute и отключает звук системы (чего я не хочу). Я думаю, что Windows перехватывает нажатие клавиши до того, как оно будет обработано моим приложением, потому что даже когда я сообщаю, что нажатие клавиши было обработано (e.Handled = true), она все равно отключает звук системы. Кстати, тот же код отлично работает для других нажатий клавиш, которые я ловлю (например, Backspace и т. Д.).

Есть ли способ остановить Windows от отключения звука?

Система: WinXP SP3, клиентский профиль .Net 4, приложение Windows Forms

Фрагменты кода

    bool keyHandled = false;

    private void Form1_KeyPress(object sender, KeyPressEventArgs e)
    {
        if (keyHandled)
        {
            e.Handled = true;
        }
    }
    // =====================================
    private void Form1_KeyDown(object sender, KeyEventArgs e)
    {
        keyHandled = false;



        switch (e.KeyCode)
        {

            case Keys.VolumeMute:
                DoSpecialProcessing(); 
                keyHandled = true;
                break;
            default:

                break;
        }

        e.Handled = keyHandled;

    }               

person LT Dan    schedule 06.06.2012    source источник
comment
В чем смысл? Пользователь переключится на другое приложение, отключит звук, переключится обратно. Или просто используйте значок в трее.   -  person Hans Passant    schedule 07.06.2012
comment
Ханс, мы пытаемся перепрофилировать пульт дистанционного управления, который отправляет нажатия клавиш, когда вы нажимаете на его кнопки. Одна кнопка отправляет нажатие клавиши VolumeMute. Мы хотим выполнять другую функцию (вместо отключения звука) при нажатии этой кнопки.   -  person LT Dan    schedule 07.06.2012


Ответы (2)


Кнопка действует как переключатель, она отключается при первом нажатии и «включает звук» при следующем нажатии. Все, что вам нужно, это имитировать нажатие VolumeMute еще раз.

Этот ответ объясняет, как это сделать.

Примечание. Если вы вызываете этот метод из обработчика KeyDown, вам, вероятно, потребуется использовать BeginInvoke или PostMessage, чтобы отправить сообщение в очередь сообщений и немедленно вернуться, чтобы избежать условий гонки.

person Jacob Seleznev    schedule 07.06.2012
comment
Спасибо Джейкоб. Но я не пытаюсь отключить звук системы. Я хочу предотвратить отключение/отключение звука Windows с помощью этого нажатия клавиши. Мое приложение может перехватывать нажатие клавиши VolumeMute и выполнять его обработку. Но я не могу запретить Windows также выполнять переключение отключения/отключения звука (которое я хочу подавить). - person LT Dan; 07.06.2012
comment
Я понимаю. Если вы имитируете другое нажатие VolumeMute после события KeyDown, конечный результат будет таким, как если бы вы подавили действие Windows по умолчанию. Я прав? - person Jacob Seleznev; 07.06.2012
comment
А, я вижу, что вы сейчас говорите. Да, наверное, это сработает. Хотя и не такое чистое решение, как хотелось бы. Я тестирую AutoHotKey, чтобы посмотреть, смогу ли я переназначить нажатие клавиши VolumeMute на другую клавишу до того, как Windows ее увидит. Я опубликую результат здесь, если кто-то еще хочет знать. - person LT Dan; 07.06.2012

В порядке. В итоге я использовал AutoHotKey, чтобы переназначить VolumeMute на другую клавишу. Важно отметить, что Windows никогда не видит нажатие клавиши VolumeMute, пока оно не будет переназначено, и не отключает звук. Так что я могу просто запустить этот скрипт переназначения AutoHotKey, когда мне это нужно. Лучше возиться с реестром Windows. Спасибо за предложения.

person LT Dan    schedule 07.06.2012