Нажатие стрелки вправо приводит к установке стрелки вверх - PullRequest
0 голосов
/ 11 сентября 2011

Я переопределяю ProcessCmdKey в таком элементе управления:

protected override bool ProcessCmdKey(ref Message msg, Keys keyData) {
    if ((keyData & Keys.Up) == Keys.Up)
        MessageBox.Show("Up arrow");
    else if ((keyData & Keys.Right) == Keys.Right)
        MessageBox.Show("Right arrow");

    // it doesn't matter what I return, the glitch happens anyway
    return base.ProcessCmdKey(ref msg, keyData);
}

И когда я нажимаю клавишу со стрелкой вверх, появляется сообщение Up arrow, но оно также появляется при нажатии клавиши со стрелкой вправо. Почему это?

Ответы [ 3 ]

3 голосов
/ 11 сентября 2011

Ответ очень прост Keys.Right имеет значение 39, а Keys.Up имеет значение 38. Ваш первый бит и операция 38 или 39 и 38, которые всегда равны 38, затем вы проверяете, если 38 равно 38, котороевсегда верно.

2 голосов
/ 11 сентября 2011

Прочитайте комментарий выше для описания проблемы.

protected override bool ProcessCmdKey(ref Message msg, Keys keyData) {
    if (keyData == ((Keys)(Keys.Shift | Keys.Up)))
        MessageBox.Show("Up arrow");
    else if (keyData == Keys.Right)
        MessageBox.Show("Right arrow");

    // it doesn't matter what I return, the glitch happens anyway
    return base.ProcessCmdKey(ref msg, keyData);
}

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

0 голосов
/ 17 апреля 2012

на самом деле проблема в том, что значения (int) ключа не являются степенями 2. Пока вы хотите захватывать только отдельные нажатия клавиш, вы можете просто использовать (keys == Keys.Up) или что-то еще.Когда вы хотите перехватить управляющие клавиши или клавиши Shift, это невозможно сделать с помощью (keyData == ((Keys) (Keys.Shift | Keys.Up))) Решение, которое я использовал, возможно, не самое сложное, но я могуНе тратьте много времени на подобные вещи.Этот подход как минимум работает:

const int WM_KEYDOWN = 0x100;
const int WM_SYSKEYDOWN = 0x104;

if  ((msg.Msg == WM_KEYDOWN) || (msg.Msg == WM_SYSKEYDOWN))) // Only act on on keydown
{
  // allkeys will contian something like "LEFT,SHIFT". Carefull in debugger:
  // Tooltip and Watch value still assumes powers of 2 and will show wrong values
  string allkeys = keys.ToString().ToUpper();
  bool shift = allkeys.contains("SHIFT");
  bool alt = allkeys.contains("ALT");
  bool control = allkeys.contains("CONTROL");
  if(allkeys.Contains("UP"))
  {}
  else if(allkeys.Contains("DOWN"))
  {}
  else if(allkeys.Contains("LEFT"))
  {}
  else (allkeys.Contains("RIGHT"))
  {}
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...