Mar*_*eIV 4 wpf keycode key-bindings
试图为我们的 WPF 命令定义一个CTRL- \(反斜杠)键绑定,但我们遇到了两个问题:
反斜杠键没有任何预定义的常量,只有 OemBackslash,并且
OemBackslash 似乎也没有一致的数字代码
例如,如果您使用的是戴尔电脑,则戴尔会为 e.Key 返回不同的值,而如果您在 Mac 上启动到 Windows,则戴尔会返回不同的值。然而,两者都正确键入反斜杠。
令我沮丧的是,不是继续处理这些代码映射到驱动程序中的内容——即键面上的实际内容——MS 基于键代码的键盘快捷键,如上所述,不一定一致。
我的想法是不使用键绑定,而是使用 PreviewKeyDown 事件,然后检查键代码,以某种方式将其传递给驱动程序以确定将代表什么类型的键(即该驱动程序会说键代码 X 表示反斜杠键面)然后将该值用于我们的逻辑。但是,我不知道如何从 KeyCode 到 key-face 可以这么说。
所以......关于如何做/处理这个的想法?
编辑
我强烈建议您不要向下滚动到编辑的结尾,我知道键盘图片很诱人,但请阅读所有内容以获得更好的体验:D
正如我所说,绝对尝试是没有意义的,这种方法是不可靠的,所以你怎么能指望不可靠的东西可靠地工作呢?甚至为此尝试对驱动程序进行逆向工程或解密 USB 流也绝对没有意义,任何理智的人都会告诉你:D
即使您实现了其中任何一个(IMO 非常不确定),您也会为特定品牌的键盘完成它。另一件事是时间因素,这是对结果的巨大浪费。
我发现在 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,我完全理解您希望在屏幕上看到这样的东西的愿望,但没有什么是完美的,尤其是在计算方面。我给了你一个伪解决方法,它实际上是等效的,试一试!
图片来源:
我一直在阅读您之前的问题,我会像汉斯所说的那样告诉您:绑定到它不是一个好主意,因为它不一定是反斜杠。
例如,在法语键盘中要获得反斜杠,您必须按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
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 次 |
| 最近记录: |