Какое сообщение я должен обработать, если мне нужно обнаружить сочетание клавиш? - PullRequest
0 голосов
/ 27 января 2011

Допустим, я ищу комбинацию клавиш Alt + C в моем приложении.Я полагаю, что не должен обрабатывать WM_KEYDOWN по различным причинам, одна из которых заключается в том, что он предназначен для обнаружения несистемных ключей и не говорит вам конкретно о ключе Alt .Он имеет только 1-битную плоскость, чтобы сообщить вам, была ли нажата любая расширенная клавиша вместе с виртуальной клавишей.

Я считаю, что WM_CHAR более подходит для меня здесьМои вопросы:

а) Правильно ли я полагаю?

б) Как мне получить код символа из wParam и сравнить его, скажем, с * 1023?* Alt + C

Ответы [ 2 ]

1 голос
/ 27 января 2011

Вы можете использовать WM_SYSKEYDOWN и WM_SYSCHAR, чтобы обнаружить нажатие Alt.

У вас есть больше информации в этой статье .

a) Нет, WM_CHAR не обнаружит и не нажмет alt.

0 голосов
/ 27 января 2011

Для общей обработки сочетаний клавиш лучше использовать Control.ProcessCmdKey override.

В Win32 он называется клавиатурным ускорителем.

У меня нет прямого опыта Control.ProcessCmdKey, но, похоже, это легко сделать.

Пример, найденный поиском Google: http://www.codeguru.com/columns/experts/article.php/c4639

protected override bool ProcessCmdKey( ref Message msg, 
                                       Keys keyData )
{
    // Check this key...
    bool bHandled = false;

    // Look up value
    Accelerators accel = Accelerators.Unspecified;
    if ( _accelHash.ContainsKey(AcceleratorKey(keyData)) )
    {
        accel = (Accelerators)_accelHash[key];

        switch ( accel )
        {
            case Accelerators.Home:
                DisplayHome();
                bHandled = true;
                break;

            case Accelerators.Save:
                Save();
                bHandled = true;
                break;

            case Accelerators.Print:
                Print();
                bHandled = true;
                break;

            case Accelerators.Logout:
                LogOut();
                bHandled = true;
                break;

            case Accelerators.Unspecified:
            default:
                break;

        } // switch
    } // if

    return bHandled;
}
...