它们真的是虚拟代码吗?

与C ++ / C相比,某些键(如shift,[,],Del等)的虚拟键代码在java中显示为不同的值。 例如 :

Key Java C / C++ Shift 16 160 [ 91 219 ] 93 221 \ 92 220 Del 127 46 Window 524 91 

这是什么原因? 这些代码是虚拟代码还是不同类型? 对于包括字母,数字,function键(F1-F12),退格键,`等的键是相同的。

我可能会误解一个概念,在这种情况下请澄清一下。

签入C / C ++

 KBDLLHOOKSTRUCT * kbhook = (KBDLLHOOKSTRUCT *) lParam; printf("%u\n",kbhook->vkCode); 

用Java检查

 private void jTextField1KeyPressed(java.awt.event.KeyEvent evt) { int code = evt.getKeyCode(); // code isEqualTo KeyEvent.VK_DELETE : NOTE } 

Ref: KeyEvent类

我应该说,虚拟密钥代码非常虚拟。

如果没有像JavaKeyToWin32Key,Win32KeyToJava等代码,那么对于您尝试与之互操作的每个平台,您都无法逃脱。

我相信所有这些密码都是历史性的。 一些来自硬件设计决策(看看Apple的“现代”键码,其中0代码是’A’,1是’S’,2是’D’等等 – 我应该继续还是你得到“模式“从键盘布局开始?”。

“为什么没有标准?”

这是生意,没什么个人的。 二十四年前,每个人都从零开始开发自己的硬件,二十五年前每个人都在努力制造出最好的CPU,15年前它们都以“平台”开始,一切都被重新定义,但也应该保持与现有解决方案的兼容性(当然,由同一家公司)。

Java是一个标准,但不适合所有人。 它已经是一个抽象,高于所有具有自己的密钥代码的操作系统。 因此“VK_”是Microsoft的遗产,Java密钥代码可能受Sun Solaris操作系统的影响,但我不确定。

虚拟键代码是在典型键盘上找到的某些键的MS特定表示。 因此虚拟修饰符。 请注意,您为Java指定的值表示使用ASCII编码时这些键的值。 它们构成较低ASCII编码的一部分。 如果OTOH,你使用了标准的C函数,比如getchar你会得到与Java相同的值,前提是你使用的是ASCII编码。 但是,您可以使用特殊的(非ASCII /非Unicode)编码,这些字符将被赋予不同的整数。

ASCII设置特别精心设计,记住可以优化某些常用操作(如小写到大写)等。

MSDN Library说明了使用虚拟密钥代码 : “按下并释放密钥时,键盘上的每个密钥都会生成一个扫描代码。扫描代码是一个与硬件相关的数字,用于标识密钥。键盘驱动程序可以转换或映射每个扫描代码为虚拟密钥代码。虚拟密钥代码是一个与硬件无关的数字,用于标识密钥。由于键盘布局因语言而异,因此Windows CE仅提供了所有虚拟密钥代码的核心代码。键盘。这个核心套装包括英文字符,数字和一些关键键,如function键和箭头键“

这是一组虚拟键代码 – 这些是从vkCode成员中检索的值。

是的,在这两种情况下它们都是虚拟代码。