| 网站首页 | 业界新闻 | 群组 | 人才 | 下载频道 | 博客 | 代码贴 | 编程论坛
雷速体育发帖软件开发QQ118000023C语言培训|一对一辅导|零基础学编程LightningChart 快速先进的.Net图表控件
共有 417 人关注过本帖
标题:关于“GetKeyState”函数的返回值
只看楼主 收藏
William1949
Rank: 1
等 级:新手上路
帖 子:34
专家分:0
注 册:2009-3-17
结帖率:66.67%
  问题点数:0  回复次数:3   
关于“GetKeyState”函数的返回值
有资料介绍说:GetKeyState 函数的返回值,其中有一段话是这样说的:
如果开关键打开,则位0设为1(开关键包括CapsLock, NumLock,ScrollLock);即(0000000000000001),如果某键正处于按下状态,则位15为1;即(1000000000000000),如已经抬起,则为0
为什么我实际测试的结果与上述不符?
问题一:不管开关键(CapsLock, NumLock,ScrollLock)是否打开或关闭,返回值都是-127、-128交替出现,貌似与开关键无关
问题二:返回值是-127(或-128)转成二进制是:1111111110000001 ,位15~位7都是1;根本不是上面说的“位15为1;即(1000000000000000)”




2018-01-11 10:39
风吹过b
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:212
帖 子:4211
专家分:25807
注 册:2008-10-15
  得分:0 
我只使用 VK_LCONTROL  进行了测试。
按我下面代码返回的结果是 byte 内容,但找到的定义是 short (占2字节,相当于VB里的 integer )
比较奇怪。
在测试过程中,显示有4种:0,-127,1,-128

   0=(0000 0000)2         这个没错,这个开关没有打开
-127=(1000 0000)2         这个也没错,这个键被按下,同时开关没有打开。
   1=(0000 0001)2         开关打开,键没按下
-128=(1000 0001)2         开关打开,键被按下

其他键我没测试,有什么疑问吗?

程序代码:
测试代码,定时器设为 100 毫秒
Option Explicit
Private Declare Function GetKeyState Lib "user32.dll" (ByVal nVirtKey As Long) As Integer
Private Const VK_LCONTROL = &H14
Private Sub Timer1_Timer()
Label1.Caption = GetKeyState(VK_LCONTROL)
End Sub

授人于鱼,不如授人于渔
早已停用QQ了
2018-01-11 20:13
风吹过b
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:212
帖 子:4211
专家分:25807
注 册:2008-10-15
  得分:0 
又测试了其他键,如 左win 键,小键盘数字键,返回结果也是 0,-127,1,-128
结果是每个键都有一个开头。结果好奇怪。
对应上面的说明。

如果开关键打开,则位0设为1(开关键包括CapsLock, NumLock,ScrollLock);即(0000000000000001),如果某键正处于按下状态,则位15为1;即(1000000000000000),如已经抬起,则为0

开关状态写在最低位,当前是否按下 写在最高位。奇怪的就是在:但最高位并不是 15位,而是 7位。

授人于鱼,不如授人于渔
早已停用QQ了
2018-01-11 20:24
William1949
Rank: 1
等 级:新手上路
帖 子:34
专家分:0
注 册:2009-3-17
  得分:0 
你说的没错,共4种结果:0、1、-127、-128
不过0 和 1 是键抬起时的结果;而-127 和 -128 是键按下时的结果,(我忽略键抬起时的状态)
当我把开关键(CapsLock, NumLock,ScrollLock)全部关闭;(使键盘上的灯全灭),进行测试
例如:用“Text1_KeyDown”事件
Private Sub Text1_KeyDown(KeyCode As Integer, Shift As Integer)
    Debug.Print GetKeyState(vbKeyA) '按下“A”键,返回-127,抬起后再按下“A”键,返回-128,-127、-128交替出现
End Sub

当我把某一开关键打开,如 NumLock;(使键盘上的灯亮),再用上段进行测试,返回的结果是相同的(也是-127、-128交替出现
)。因此我觉得“GetKeyState”函数不能反应出开关键的状态,有些资料有误导
2018-01-12 13:33







关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.041625 second(s), 9 queries.
Copyright©2004-2018, BCCN.NET, All Rights Reserved