它们真的是虚拟代码吗?

时间:2012-06-01 10:51:04

标签: java c++ c keycode

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

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

这是什么原因?这些代码是虚拟代码还是不同类型?对于包括字母,数字,功能键(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

}

参考:KeyEvent class

4 个答案:

答案 0 :(得分:3)

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

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

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

“为什么没有标准?”

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

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

答案 1 :(得分:2)

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

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

答案 2 :(得分:1)

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

以下是Virtual-Key Codes的一组 - 这些是您从KBDLLHOOKSTRUCTvkCode成员中检索到的值。

答案 3 :(得分:0)

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