Как создать привязку ключа к ключу обратной косой черты в WPF?


Попытка определить CTRL- (обратная косая черта) привязка клавиш для нашей команды WPF, но мы сталкиваемся с двумя проблемами:

  1. Нет никакой предопределенной константы для ключа обратной косой черты, только OemBackslash и

  2. Похоже, что для OemBackslash также не существует последовательного числового кода

Например, Dell возвращает другое значение для e. Key, если вы находитесь на Dell, а не если вы загружены в Windows на Mac. Тем не менее, оба делают правильно введите обратную косую черту.

Что меня расстраивает, так это то, что вместо того, чтобы идти на то, что эти коды отображают в драйвере-то есть то, что на самом деле находится на клавиатуре-MS основывает свои сочетания клавиш на ключевом коде, который, как объяснено выше, не обязательно согласован.

Моей мыслью было вместо того, чтобы использовать привязки ключей, использовать событие PreviewKeyDown, затем проверить код ключа, каким-то образом передать его драйверу, чтобы определить, какой типизированный ключ будет представлять (т. е. скажем, keycode X представляет обратную косую черту ключа), то используйте это значение для нашей логики. Однако я не знаю, как перейти от ключевого кода к ключевому лицу, так сказать.

Итак... Мысли о том, как это сделать/справиться с этим?

1 3

1 ответ:

EDIT

я настоятельно рекомендую вам воздержаться от прокрутки вниз до конца редактирования, я знаю, что изображение клавиатуры очень заманчиво, но прочитайте все, чтобы получить лучший опыт :D

Как я уже сказал, нет никакого смысла абсолютно пытаться, этот метод ненадежен, поэтому Как вы можете ожидать, что что-то ненадежное будет работать надежно ? нет абсолютно никакого смысла даже пытаться декомпилировать драйвер или расшифровать по USB ручьи за это любой здравомыслящий сказал бы вам следующее: D

Даже если бы вы достигли любого из них (в чем IMO сильно сомневается), вы бы сделали это для определенной марки клавиатуры. Другое дело-фактор времени, это огромная трата времени на результат.

Самая близкая вещь к металлу в C#, которую я нашел, это:

Использование необработанного ввода C# для обработки нескольких клавиатур

RawInputProcess.RawKeyboard.ProcessRawInput вызовы GetRawInputData от User32 И даже это низкоуровневое вещество делает верните 0xDC или 220 (то есть потрясающий Oem5). Это вызывает VirtualKeyCorrection, который исправляет некоторые ключи, вы могли бы сделать что-то там, хотя это довольно уродливо, а также и ненадежно, как это может быть.

Кроме того, здесь есть куча ссылок о библиотеках HID

Мой окончательный ответ:

Вы абсолютно хотите иметь возможность связывать ?

И там у вас будет привязка по умолчанию к Ctrl+\.

Теперь немного истории и что-то, что вы, вероятно, еще не поймали !

Если вы внимательно посмотрите на MSDN docs - > ключи Перечисление

OemBackslash

OEM-угловая скобка или клавиша обратной косой черты на клавиатуреRT 102 key keyboard (Windows 2000 или более поздней версии).

Я почти уверен, что вы знаете эту вещь, но даже не обратили на нее внимания.

Введите описание изображения здесь

Введите описание изображения здесь

Я лично играл с ним на клоне IBM XT еще в 86-м, когда мне было 5 лет.

Теперь ты, наверное, начинаешь понимать, но я просто сделаю это кристально ясным. :

OemBackslash является пережитком 80-х годов, как и многие другие вещи в Windows (хотя большинство, если не все, были удалены в текущих версиях)

Так что если только у вас нет одной из этих клавиатур, вы Никогда не получите эту KeyCode!

Я не могу быть уверен на 100%, если кто-то не протестирует RT-102 с адаптером DIN к PS / 2 под 2000 / XP, было бы интересно увидеть результат; но что заставляет меня уверенно говорить это , 1-й документ, 2-й вообще люди в Microsoft знают, что они делают, они написали эту вещь. Я бы съел свою шляпу, если бы это оказалось ложью.

Я надеюсь, что вы будете удовлетворены моим редактированием и, наконец, скорбитеOemBackslash , я прекрасно понимаю ваше желание видеть такую вещь на экране, но ничто не идеально, особенно в вычислительной технике. Я дал вам псевдо обходной путь, который буквально эквивалентен , попробуйте !

Кредиты за фотографии идут кому:


Я читал ваш предыдущий вопрос, я бы сказал вам, как сказал Ганс: не очень хорошая идея привязываться к нему, потому что это не обязательно будет обратная косая черта.

Например, во французской клавиатуре для получения обратной косой черты нужно нажать AltGr и 8, AltGr - ничто больше, чем Alt+Ctrl , что подразумевает дополнительное нажатие Alt для этого макета, чтобы выполнить вашу команду.

Http://en.wikipedia.org/wiki/AltGr_key

Короче говоря, этот ярлык ненадежен, поскольку он не является постоянным в соответствии с макетом и / или производителем.

В WPF есть KeyInterop.VirtualKeyFromKey но он также возвращает Oem5 : (

Глядя на документы, вы даете окончательный ответ : Коды Виртуальных Ключей

VK_OEM_5
0xDC
Used for miscellaneous characters; it can vary by keyboard.
For the US standard keyboard, the '\|' key

Но вот решение :D

Наезд \ принесет Oem5, но, отправив событие в TextBox, например, ваша система сделает всю магию, чтобы преобразовать его в a \. Затем вы можете взять TextBox.Text и действовать соответственно в зависимости от ключа, который был введен вместе с модификаторами.

Введите описание изображения здесь

private bool _done;
private void MainWindow_OnKeyDown(object sender, KeyEventArgs e)
{
    if (_done) return;
    _done = true;

    var presentationSource = PresentationSource.FromDependencyObject(this);
    var keyEventArgs = new KeyEventArgs(Keyboard.PrimaryDevice, presentationSource, 0, e.Key)
    {
        RoutedEvent = KeyDownEvent
    };
    TextBox1.Focus();
    TextBox1.RaiseEvent(keyEventArgs);
}

private void TextBox1_OnTextChanged(object sender, TextChangedEventArgs e)
{
    var text = TextBox1.Text;
}

Примечание 1: boolean здесь, чтобы предотвратить StackOverflow: D

Примечание 2: это вероятно, так же ненадежно, как и ключ, что делать, если пользователь имеет Shift on ? Я не пытался

Это просто доказательство того, что это возможно, но лично я бы не пошел по этому пути, это слишком уродливо IMO; я бы предпочел позволить пользователю сопоставлять команды с любым жестом, который он пожелает. И явно не позволит ему привязаться к \ :)

EDIT

У меня есть клавиатура MS и есть mskey.exe , что позволяет диагностировать вашу клавиатуру :

Введите описание изображения здесь

Он действительно импортирует HID.DLL функции, такие как HidP_GetValueCaps , так что вы могли бы быть в состоянии достичь этого более чистым способом через некоторые P / Invoke, но это кажется много работы, хотя.