求高手解答,C语言问题

这些都是实现按上下左右键,但是数字又各不相同,为什么?他们之间有什么联系!另外我在俄罗斯方块游戏中看到直接使用VK_UP,VK_LEFT……这又是怎么回事?如果我要这么用... 这些都是实现按上下左右键,但是数字又各不相同,为什么?他们之间有什么联系!
另外我在俄罗斯方块游戏中看到直接使用VK_UP,VK_LEFT……这又是怎么回事?如果我要这么用,具体该怎么做
展开
 我来答
很浪的碰碰车
2013-08-08 · TA获得超过1866个赞
知道小有建树答主
回答量:211
采纳率:0%
帮助的人:316万
展开全部

键盘有虚拟码和扫描码两个,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。如果想那样调用就重新定义一下吧。

个人理解,仅供参考。

Lotayou
2013-08-08 · TA获得超过382个赞
知道小有建树答主
回答量:347
采纳率:0%
帮助的人:93.3万
展开全部
可以定义常变量啊,很标准的

const int UP = 72, DOWN = 75, LEFT = 77, RIGHT = 80;

switch(0xff & c2){
case UP: printf("1\n");break;
case DOWN://...
//......
default: break;
}
本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
ylssrb
2013-08-08
知道答主
回答量:17
采纳率:0%
帮助的人:3.8万
展开全部
这个问题牵涉到键盘的扫描码和windows虚拟键码的概念
对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进制值之间的转换
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
yajuntiantian
2013-08-08 · TA获得超过483个赞
知道小有建树答主
回答量:666
采纳率:0%
帮助的人:152万
展开全部
恩!其实这些数是相同的!
我现在不方便模拟!不过我认为:
你的前俩个图片里的是键盘上的上下左右键,上面两幅图的数值第一幅是16进制的,第二幅是10进制的。
而你的下面俩张图片是键盘上的w,s,a,d!第三幅是10进制的,第四幅是6进制。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
仲奇正2q
2013-08-08
知道答主
回答量:21
采纳率:0%
帮助的人:17.3万
展开全部
0x代表16进制,也就是说0x48 = 72,0x50 = 80,0x4b = 75,0x4d = 77,;

而VK_UP、WK_DOWN等等,是宏定义,定义即为对应的数字。如果你要用的话,建议你去了解一点WIN32编程的东西,其中的键盘消息有讲这些。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
jefferyang123
2013-08-08 · TA获得超过707个赞
知道小有建树答主
回答量:124
采纳率:0%
帮助的人:130万
展开全部
0x代表16进制,换算成十进制之后数字就对上0x25=37,0x48=72
追问
那0x25与0x48哪个才是对的
追答
试了下是0x48
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
Magic_旭
2013-08-08 · 超过41用户采纳过TA的回答
知道答主
回答量:287
采纳率:100%
帮助的人:119万
展开全部
肯定以winuser.h中定义的为准啊,0x25它是一个十六进制数,对应的十进制也就是37,
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(5)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式