标题:关于“GetKeyState”函数的返回值
只看楼主
William1949
Rank: 3Rank: 3
等 级:新手上路
威 望:8
帖 子:109
专家分:0
注 册:2009-3-17
结帖率:70%
 问题点数: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
等 级:贵宾
威 望:364
帖 子:4912
专家分:29900
注 册: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
等 级:贵宾
威 望:364
帖 子:4912
专家分:29900
注 册: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: 3Rank: 3
等 级:新手上路
威 望:8
帖 子:109
专家分: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



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-484155-1-1.html




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

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