Подбирая нажатия клавиш Ctrl-Alt-Q - PullRequest
2 голосов
/ 06 ноября 2011

Какой «правильный / лучший» способ подобрать комбинацию нажатий клавиш?Этими клавишами являются: Ctrl + Alt + Q , я хочу, чтобы пользователь нажимал их все одновременно, и в этот момент я собираюсь открытьокно.В настоящее время я делаю это с помощью массива, а затем отлавливаю каждое нажатие клавиши по отдельности, но мои результаты противоречивы, особенно в отношении конкретной марки комбинации ноутбука Dell / Windows 7, но это уже другая история.

То есть, потратив пять минут на Google, это просто грубая версия после просмотра msdn, но, как я уже говорил ранее, эта версия (не проверенная) является правильным / лучшим способом сделать это?

protected override bool ProcessCmdKey(ref Message msg, Keys keyData)    
{
    const int WM_KEYDOWN = 0x100;
    const int WM_SYSKEYDOWN = 0x104;

    if ((msg.Msg == WM_KEYDOWN) || (msg.Msg == WM_SYSKEYDOWN))
    {
        switch(keyData)
        {
            case Keys.Control | Keys.Alt | Keys.Q:
            this.Parent.Text="<CTRL> + Alt + Q Captured";
            break;
        }               
    }

    return base.ProcessCmdKey(ref msg,keyData);
}

Ответы [ 4 ]

6 голосов
/ 06 ноября 2011

Игнорировать msg.Msg, только посмотрите на keyData. И верните true, не вызывая base, если вы используете нажатие клавиши. Что упрощает это до:

protected override bool ProcessCmdKey(ref Message msg, Keys keyData)    
{
    if (keyData == (Keys.Control | Keys.Alt | Keys.Q)) {
        this.Parent.Text="<CTRL> + Alt + Q Captured";
        return true;
    }
    return base.ProcessCmdKey(ref msg,keyData);
}

Это, вероятно, должно быть переопределением метода формы, чтобы вы не зависели от элемента управления, имеющего фокус. Вы бы использовали это. Текст вместо этого.

1 голос
/ 06 ноября 2011

Согласно документации для System.Windows.Forms.Keys, вы не можете использовать побитовое ИЛИ для проверки комбинаций клавиш.В документации говорится: «Для более точного управления используйте функции Win32 API GetKeyState, GetAsyncKeyState или GetKeyboardState, определенные в user32.dll ...».Но похоже, что Shift, Alt и Control могут использоваться как побитовые флаги.

1 голос
/ 06 ноября 2011

Да, вот как бы я это сделал, если бы хотел прослушать ключевые события глобально .

Но если вас интересуют ТОЛЬКО вводы с клавиатуры, когда ваша программа является сфокусированным окном (спереди в Windows), вы можете использовать событие KeyDown:

private void textBox1_KeyDown(object sender, System.Windows.Forms.KeyEventArgs e)
{
 // your code goes here
}
0 голосов
/ 13 января 2014

Для тех, кто хочет открыть окно или сделать видимым / невидимым с помощью комбинации трех клавиш (с двумя модификаторами) при свете @Hans Passant, я наконец нашел ответ на мою проблему. Я остерегался | операнд, поставив вместо && операнд, который не работал. Может быть назначено для свойств WFA Keydown

private void ShowHidden_Click(object sender, KeyEventArgs e)
    {
        if (e.KeyData == (Keys.Control | Keys.Alt | Keys.M) )
        {
            OldBisProdId.Visible = true;
            OldGanProdId.Visible = true;
        }
        if (e.KeyData == (Keys.Control | Keys.Alt | Keys.C))
        {
            OldBisProdId.Visible = false;
            OldGanProdId.Visible = false;
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...