如何在 WPF 中创建反斜杠键的键绑定?

Mar*_*eIV 4 wpf keycode key-bindings

试图为我们的 WPF 命令定义一个CTRL- \(反斜杠)键绑定,但我们遇到了两个问题:

  1. 反斜杠键没有任何预定义的常量,只有 OemBackslash,并且

  2. OemBackslash 似乎也没有一致的数字代码

例如,如果您使用的是戴尔电脑,则戴尔会为 e.Key 返回不同的值,而如果您在 Mac 上启动到 Windows,则戴尔会返回不同的值。然而,两者都正确键入反斜杠。

令我沮丧的是,不是继续处理这些代码映射到驱动程序中的内容——即键面上的实际内容——MS 基于键代码的键盘快捷键,如上所述,不一定一致。

我的想法是不使用键绑定,而是使用 PreviewKeyDown 事件,然后检查键代码,以某种方式将其传递给驱动程序以确定将代表什么类型的键(即该驱动程序会说键代码 X 表示反斜杠键面)然后将该值用于我们的逻辑。但是,我不知道如何从 KeyCode 到 key-face 可以这么说。

所以......关于如何做/处理这个的想法?

Ayb*_*ybe 5

编辑

我强烈建议您不要向下滚动到编辑的结尾,我知道键盘图片很诱人,但请阅读所有内容以获得更好的体验:D

正如我所说,绝对尝试是没有意义的,这种方法是不可靠的,所以你怎么能指望不可靠的东西可靠地工作呢?甚至为此尝试对驱动程序进行逆向工程或解密 USB 流也绝对没有意义,任何理智的人都会告诉你:D

即使您实现了其中任何一个(IMO 非常不确定),您也会为特定品牌的键盘完成它。另一件事是时间因素,这是对结果的巨大浪费。

我发现在 C# 中最接近金属的是这个:

使用来自 C# 的原始输入来处理多个键盘

RawInputProcess.RawKeyboard.ProcessRawInput从 User32调用GetRawInputData甚至这种低级的东西也确实返回 0xDC 或 220(即非常棒的Oem5)。这个调用VirtualKeyCorrection纠正了一些键,你可以在那里做一些事情,尽管它也很丑陋并且尽可能不可靠。

此外,还有一堆的链接有关HID库在这里

我的明确回答:

你绝对希望能够绑定?

在那里,您将拥有对Ctrl+的默认绑定\

现在有点历史和一些你可能还没有抓住的东西!

如果您仔细查看 MSDN 文档 -> Keys Enumeration

OEM反斜杠

RT 102 键键盘(Windows 2000 或更高版本)上的 OEM 尖括号或反斜杠键。

我很确定你知道这件事,但甚至没有注意它。

在此处输入图片说明

在此处输入图片说明

我个人在 86 年 5 岁时就在 IBM XT 克隆上玩过它。

现在你可能已经开始理解了,但我会说得很清楚:

OemBackslash是 80 年代的遗迹,与 Windows 中的许多其他东西非常相似(尽管在当前版本中大部分(如果不是全部)已被删除)

因此,除非您确实拥有这些键盘之一,否则您将永远不会收到这个KeyCode

除非有人在 2000/XP 下使用 DIN 转 PS/2 适配器测试 RT-102,否则我不能 100% 确定,看到结果会很有趣;但让我有信心这么说的是,第一是文档,第二是通常微软的人知道他们做什么,他们写了那件事。如果这是假的,我会吃掉我的帽子。

我希望您对我的编辑感到满意并最终哀悼OemBackslash,我完全理解您希望在屏幕上看到这样的东西的愿望,但没有什么是完美的,尤其是在计算方面。我给了你一个伪解决方法,它实际上是等效的,试一试!

图片来源:


我一直在阅读您之前的问题,我会像汉斯所说的那样告诉您:绑定到它不是一个好主意,因为它不一定是反斜杠。

例如,在法语键盘中要获得反斜杠,您必须按AltGr8AltGr无非是Alt+Ctrl这意味着另外按此Alt布局以执行您的命令。

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

简而言之,这个捷径是不可靠的,因为它根据布局和/或制造商不是恒定的。

在 WPF 中有KeyInterop.VirtualKeyFromKey但它Oem5也会返回:(

查看文档给出了明确的答案:Virtual-Key Codes

VK_OEM_5
0xDC
Used for miscellaneous characters; it can vary by keyboard.
For the US standard keyboard, the '\|' key
Run Code Online (Sandbox Code Playgroud)

但这是一个解决方案:D

命中\将带来 Oem5,但通过将事件发送到TextBox例如,您的系统将尽一切力量将其转换为\. 然后,您可以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;
}
Run Code Online (Sandbox Code Playgroud)

注意 1:boolean这里是为了防止 StackOverflow :D

注意 2:这可能和关键一样不可靠,如果用户Shift打开了怎么办?我没试

这只是一个概念证明,它是可能的,但我个人不会走这条路,IMO 太丑了;我宁愿允许用户将命令映射到他想要的任何手势。并且显然不允许他绑定到\:)

编辑

我有一个 MS 键盘,并且有 mskey.exe可以诊断您的键盘:

在此处输入图片说明

它确实导入了 HID.DLL 函数,例如HidP_GetValueCaps,因此您可以通过一些 P/Invoke 以更简洁的方式实现这一点,但似乎需要做很多工作。


归档时间:

查看次数:

1520 次

最近记录:

9 年,2 月 前