Как преобразовать символ в key code?

Как преобразовать обратную косую черту ('\') в key code?

На моей клавиатуре код обратной косой черты равен 220, но метод ниже

(int)'\\'

возвращает мне 92.

Мне нужно некоторое общее преобразование, например

 int ConvertCharToKeyValue(char c)
 {
     // some code here...
 }

Любые идеи?

Ответ 1

Вы можете P/Invoke VkKeyScan() преобразовать типизацию key code обратно в виртуальный ключ. Помните, что состояние ключа-модификатора важно, получая "|" требует удержания клавиши shift на моей раскладке клавиатуры. Ваша подпись функции не позволяет этого, поэтому я просто что-то сделал:

    public static Keys ConvertCharToVirtualKey(char ch) {
        short vkey = VkKeyScan(ch);
        Keys retval = (Keys)(vkey & 0xff);
        int modifiers = vkey >> 8;
        if ((modifiers & 1) != 0) retval |= Keys.Shift;
        if ((modifiers & 2) != 0) retval |= Keys.Control;
        if ((modifiers & 4) != 0) retval |= Keys.Alt;
        return retval;
    }

    [System.Runtime.InteropServices.DllImport("user32.dll")]
    private static extern short VkKeyScan(char ch);

Также будьте осторожны с раскладками клавиатуры, которые должны использовать мертвые клавиши (Alt + Gr) для создания клавиш ввода. Этот код лучше всего избегать.

Ответ 2

Если

var char = System.Windows.Forms.Keys.OemPipe; // 220
var code = (int)char;

затем

public static int ToKeyValue(this char ch)
{
    return (int)(System.Windows.Forms.Keys)ch;
}

Ответ 3

Нет функции, которую я знаю, которая отобразит символ в виртуальную key code. Однако для создания такого сопоставления вы можете использовать следующую таблицу.

http://msdn.microsoft.com/en-us/library/dd375731(v=VS.85).aspx.

Обратите внимание, что вам нужно знать клавиатуру, глядя на ключ, который вы упоминаете "\", это виртуальный ключ VK_OEM_5, который для американских клавиатур "\", если не сдвинут, и "|" если они сдвинуты, поэтому ваша функция должна знать, что клавиатура также используется.

Конечно, если вы хотите сопоставить виртуальный key code символ, вы можете использовать interop, чтобы вызвать Функция MapVirtualKeyEx.

Обновление. На основе вашего комментария это даст вам то, что вы хотите.

[DllImport("user32.dll")]
static extern int MapVirtualKey(int uCode, uint uMapType);

const uint MAPVK_VK_TO_CHAR = 0x02;

private void textBox1_KeyDown(object sender, KeyEventArgs e)
{
  int key = MapVirtualKey((int)e.KeyCode, MAPVK_VK_TO_CHAR);
  if (key == (int)'\\')
  {

  }
}

Ответ 4

Или вы можете сохранить его простым и бросить.

(Keys)keyToConvert