尝试为我们的WPF命令定义 CTRL - \ (反斜杠)键绑定,但我们遇到了两个问题:
反斜杠键没有任何预定义的常量,只有OemBackslash和
对于OemBackslash来说似乎不是一致的数字代码
例如,如果您使用的是戴尔,那么戴尔将为e.Key返回不同的值,如果您在Mac上启动进入Windows。但两者都正确输入反斜杠。
让我感到沮丧的是,而不是继续这些代码在驱动程序中映射的内容 - 即。实际上在关键面上是什么 - MS基于密钥代码的键盘快捷键,如上所述,并不一定是一致的。
我的想法不是使用键绑定,而是使用PreviewKeyDown事件,然后检查键代码,以某种方式将它传递给驱动程序以确定代表什么类型的键(即驱动程序会说键码X代表反斜杠)然后使用该值作为我们的逻辑。但是,我不知道如何从KeyCode转到key-face。
那么......关于如何处理/解决这个问题的想法?
答案 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或更高版本)。
我很确定你知道这件事,但甚至没有注意它。
当我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
并根据键入的键和修饰符进行相应操作。
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,可以诊断你的键盘:
它确实导入了HidP_GetValueCaps之类的HID.DLL函数,所以你可以通过一些P / Invoke以更干净的方式实现这个功能,但它看起来很多工作。