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

时间:2014-04-04 07:04:16

标签: wpf key-bindings keycode

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

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

  2. 对于OemBackslash来说似乎不是一致的数字代码

  3. 例如,如果您使用的是戴尔,那么戴尔将为e.Key返回不同的值,如果您在Mac上启动进入Windows。但两者都正确输入反斜杠。

    让我感到沮丧的是,而不是继续这些代码在驱动程序中映射的内容 - 即。实际上在关键面上是什么 - MS基于密钥代码的键盘快捷键,如上所述,并不一定是一致的。

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

    那么......关于如何处理/解决这个问题的想法?

1 个答案:

答案 0 :(得分:4)

修改

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

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

即使您已经实现了这些(IMO非常不确定),您也可以为特定品牌的键盘完成任务。另一件事是时间因素,这对结果来说是浪费大量时间。

C#中最接近金属的东西是:

Using Raw Input from C# to handle multiple keyboards

来自User32的

RawInputProcess.RawKeyboard.ProcessRawInput来电GetRawInputData 甚至这种低级别的东西也会返回0xDC或220(即极好的 Oem5 )。这会调用VirtualKeyCorrection来纠正某些键,你可以在那里做一些事情虽然它很丑陋但也不可靠。

此外,还有一些关于HID库here

的链接

我的最终答案:

你绝对希望能够绑定?

然后你将默认绑定到 Ctrl + \

现在有点历史,你可能还没有抓到它!

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

OemBackslash

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

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

enter image description here

enter image description here

当我5岁的时候,我亲自在IBM XT克隆上玩#86。

现在你可能已经开始明白了,但我只是说清楚了:

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

所以除非你确实拥有其中一个键盘,否则你永远不会收到这个KeyCode

除非有人在2000 / XP下用DIN到PS / 2适配器测试RT-102,否则我无法100%确定,看到结果会很有趣; 但是让我有信心说这是,第一个是文档,第二个普通人都知道他们做了什么,他们写了那个东西。如果这是假的,我会吃我的帽子。

我希望你对我的编辑感到满意并最终哀悼 OemBackslash ,我完全理解你希望在屏幕上看到这样的东西,但没有什么是完美的,特别是在计算方面。我给你一个伪的解决方法字面上相当于,试一试!

图片的积分转到:


我一直在阅读your previous question,我告诉你,汉斯说:绑定它并不是一个好主意,因为它不一定是反斜杠。

例如在法语键盘中获取反斜杠你必须按 AltGr 8 AltGr 只不过是 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

但这是一个解决方案:D

点击 \ 会带来Oem5但是通过向TextBox发送一个事件,例如你的系统会做所有的魔法将它转换为 \ 。然后,您可以抓取TextBox.Text并根据键入的键和修饰符进行相应操作。

enter image description here

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 该怎么办?我没有尝试

这只是一个概念证明它是可能的,但我个人不会采取这条道路,它太丑陋的IMO;我宁愿允许用户将命令映射到他希望的任何姿势。显然不允许他绑定到 \ :)

修改

我有一个MS键盘和there is mskey.exe,可以诊断你的键盘:

enter image description here

它确实导入了HidP_GetValueCaps之类的HID.DLL函数,所以你可以通过一些P / Invoke以更干净的方式实现这个功能,但它看起来很多工作。