![](https://iknow-base.cdn.bcebos.com/lxb/notice.png)
求高手解答,C语言问题
另外我在俄罗斯方块游戏中看到直接使用VK_UP,VK_LEFT……这又是怎么回事?如果我要这么用,具体该怎么做 展开
键盘有虚拟码和扫描码两个,Ox25等这四个是键盘虚拟码,Ox48等四个是键盘的扫描码,一下是我找到的一些参考信息:
——————————————————————————————————————
当用户按下某个键时,
1.键盘会检测到这个动作,并通过键盘控制器把扫描码(scan code)传送到计算机;
键盘扫描码跟具体的硬件有关的,不同厂商对同一个键的扫描码有可能不同。
2.计算机接收到扫描码后,将其交给键盘驱动程序;
3.键盘驱动程序把这个扫描码转换为键盘虚拟码;
虚拟码与具体硬件无关,不同厂商的键盘,同一个键的虚拟码总是相同的。
3.然后,键盘驱动程序把该键盘操作的扫描码和虚拟码以及其它信息传递给操作系统;
4.操作系统将获得的信息封装在一个键盘消息中,并把该键盘消息插入到消息列队。
5.通过Windows的消息系统,该键盘消息被送到某个窗口中;
6.窗口所在的应用程序接收到消息后,可以了解到有关键盘操作的信息,然后决定作出一定的响应
——————————————————————————————————————
37,38,39,40就是ASCII码,也就是虚拟码。而且方向键值是有两个,第一个是有符号数-32,你第二张图里的判断ch==224,判断是它的无符号数,跟-32是一样的。第二个就是它的真实键值,你可以用下面的代码查看(c++)
int main()
{
char c;
while( c = getch() ) { printf( "%d ", c ); }
return 0;
}
至于为什么取出的是72,75,77,80应该是直接取了扫描码,我用其他编程语言测了下,取出来的只是ascii37,38,39,40。如果想那样调用就重新定义一下吧。
个人理解,仅供参考。
![](https://ecmc.bdimg.com/public03/b4cb859ca634443212c22993b0c87088.png)
2024-08-21 广告
const int UP = 72, DOWN = 75, LEFT = 77, RIGHT = 80;
switch(0xff & c2){
case UP: printf("1\n");break;
case DOWN://...
//......
default: break;
}
对XT键盘以及之后的兼容键盘而言,0x48,0x4b,0x4d,0x50分别是上、左、右、下方向键的键盘扫描码(在早期linux内核程序中可以看到)。该值与具体的硬件设备相关,例如XT机键盘与AT机键盘的差异就很大;
而VK_UP,VK_LEFT,VK_RIGHT,VK_DOWN则是在WINDOWS上层应用程序中使用的虚拟键码,它掩盖了底层可能由不同硬件带来的编码差异,使得上层可以使用统一的键盘编码
另外: 0x48 = 72, 0x4b = 75,0x4d = 77,0x50 = 80
0x25 = 37,0x26 = 38,0x27 = 39,0x28 = 40
这只是16进制值与10进制值之间的转换
我现在不方便模拟!不过我认为:
你的前俩个图片里的是键盘上的上下左右键,上面两幅图的数值第一幅是16进制的,第二幅是10进制的。
而你的下面俩张图片是键盘上的w,s,a,d!第三幅是10进制的,第四幅是6进制。
而VK_UP、WK_DOWN等等,是宏定义,定义即为对应的数字。如果你要用的话,建议你去了解一点WIN32编程的东西,其中的键盘消息有讲这些。
那0x25与0x48哪个才是对的
试了下是0x48