与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
}
答案 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)
以下是Virtual-Key Codes的一组 - 这些是您从KBDLLHOOKSTRUCT的vkCode
成员中检索到的值。
答案 3 :(得分:0)
是的,在这两种情况下它们都是虚拟代码。