近日看到很多网友都在询问是否有办法在PB 中控制判断Caps Lock键和Num Lock键的按下状态,以及按键大写和小键盘是否开启。网上有VB实现的相关的说明,感觉很容易。
那在PB中怎么实现呢?因为PB中有判断按键功能的事件以及相关函数。但是自身没有办法捕捉键盘已有的状态,如小键盘的指示灯是否开启,大写指示灯是否已经开启,很容易让我们想到Windows API,老实说PB调用Windows API还是很方便的。通过网络上的信息我找到了如下API函数:GetKeyState,关于其具体说明在此不做冗叙述,感兴趣的朋友上网上Search一下很多,我们看一下它的PB声明:
Function int GetKeyState(integer VirtualKeycode) Library "User32.dll"
该API函数只有一个参数 integer VirtualKeycode ,如果返回值为0的时候表示没有按下,返回值为1的时候表示已经按下。VirtualKeycode表示的是键盘上的按键所对应的虚拟按键码,我们都知道A=65,几经周折我发现了Caps Lock对应的虚拟按键码是 20 ,Num Lock的虚拟按键码是 144,知道这个我们就可以Go on了。做个实验我们在一个窗口上方式两个st控件 st_1,st_2,在窗口打开的时候分别存放显示判断大写键盘指示灯 和 数字键盘指示灯开启状况。在窗体的Open事件中写下:
int rtn
rtn = GetKeyState(20)
if rtn = 0 then
st_1.text="没有开启大写指示灯"
else
st_1.text="已经开启大写指示灯"
end if
int rtn1
rtn1 = GetKeyState(144)
if rtn1 = 0 then
st_2.text="没有开启小键盘"
else
st_2.text="已经开启小键盘"
end if
到此OK,判断指示灯开启状态已经完成。
还有一个问题就是我们如何在按键切换 Caps Lock 或Num Lock的同时刷新st_1,st_2 的显示内容让其谁着指示灯的状态而改变呢?
实现方法就容易了许多,我们知道PB中有Key事件是在键盘按下时触发,所以只需要在按键的时候判断出按键判断出指示灯的状态就可以了。代码如下:
int rtn
rtn = GetKeyState(20)
if rtn=0 or rtn = -128 then //按键的时候如果为-128则为没有开启 -127表示开启
st_1.text="没有开启大写指示灯"
else
st_1.text="已经开启大写指示灯"
end if
int rtn1
rtn1 = GetKeyState(144)
if rtn1=0 or rtn1 = -128 then
st_2.text="没有开启小键盘"
else
st_2.text="已经开启小键盘"
end if
到此已经大功告成了。如有疑意,可以与我联系MSN dlyhw521@hotmail.com QQ 28551082。