主题:GetKeyboardState之参数问题,APIer请进
首先说说GetKeyboardState的正确用法,和问题来源吧。。。
GetKeyboardState声明:
Public Declare Function GetKeyboardState Lib "user32" Alias "GetKeyboardState" (pbKeyState As Byte) As Long
我的代码:
Private Sub Timer1_Timer()
dim kbState(255) as byte,ret as Long
ret=GetKeyboardState(kbState(0))
if ret<>0 then
if (kbState(13) And &H80)=&H80 Then
msgbox "你按了回车键"
end if
end if
end sub
好,以上可以实现实时监测键值。
那么,问题出来了,发现这个函数能由于kbState(0)的地址传入而改变一整个数组,想到传说中的API与C/C++有关,所有这个能参数需要的肯定是一个指针值(地址值)。于是乎我大胆地把函数声明更改如下:
Public Declare Function GetKeyboardState Lib "user32" Alias "GetKeyboardState" (pbKeyState As Long) As Long
但到了这一步,发现声明这里就报错了。[color=FF0000]这是问题之一,参数需要一个地址值,声明成Long居然是错的?Why?[/color]
于是再来,我又把声明改成了:
Public Declare Function GetKeyboardState Lib "user32" Alias "GetKeyboardState" (pbKeyState As Any) As Long
调用改成ret=GetKeyboardState(varptr(kbState(0))
这时不用说,程序撑不到半秒钟崩溃了。[color=FF0000]这是问题之二:为什么同样传入个地址值(varptr取kbState(0)的地址),这样子就不行?[/color]
这个问题有点莫名其妙,但是还是请知道的人说说看吧!
GetKeyboardState声明:
Public Declare Function GetKeyboardState Lib "user32" Alias "GetKeyboardState" (pbKeyState As Byte) As Long
我的代码:
Private Sub Timer1_Timer()
dim kbState(255) as byte,ret as Long
ret=GetKeyboardState(kbState(0))
if ret<>0 then
if (kbState(13) And &H80)=&H80 Then
msgbox "你按了回车键"
end if
end if
end sub
好,以上可以实现实时监测键值。
那么,问题出来了,发现这个函数能由于kbState(0)的地址传入而改变一整个数组,想到传说中的API与C/C++有关,所有这个能参数需要的肯定是一个指针值(地址值)。于是乎我大胆地把函数声明更改如下:
Public Declare Function GetKeyboardState Lib "user32" Alias "GetKeyboardState" (pbKeyState As Long) As Long
但到了这一步,发现声明这里就报错了。[color=FF0000]这是问题之一,参数需要一个地址值,声明成Long居然是错的?Why?[/color]
于是再来,我又把声明改成了:
Public Declare Function GetKeyboardState Lib "user32" Alias "GetKeyboardState" (pbKeyState As Any) As Long
调用改成ret=GetKeyboardState(varptr(kbState(0))
这时不用说,程序撑不到半秒钟崩溃了。[color=FF0000]这是问题之二:为什么同样传入个地址值(varptr取kbState(0)的地址),这样子就不行?[/color]
这个问题有点莫名其妙,但是还是请知道的人说说看吧!