040102.htm
来自「提供一个VB学习教程,入门级。来源于网上」· HTM 代码 · 共 171 行 · 第 1/2 页
HTM
171 行
<html>
<head>
<meta http-equiv="Content-Language" content="zh-cn">
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<title>vb study</title><style>
<!--
td {font-size: 9pt}
A:link {text-decoration: none; color: #0033cc;font-size: 9pt}
A:visited {text-decoration: none; color: #0066CC;font-size: 9pt}
A:active {text-decoration: none; color: #ff0000; font-size: 9pt}
A:hover {text-decoration: underline; color: #000000;font-size: 9pt}
-->
</style>
</head>
<body>
<div align="center">
<center>
<table border="0" cellpadding="0" cellspacing="0" width="98%">
<tr>
<td width="100%"><a href="#">你的位置</a>:<a href="http://www.xxby.com" target="_blank">华生小屋</a>--<a href="#">VB学习</a>--<a href="#">API函数</a></td>
</tr>
<tr>
<td width="100%">
<p align="center"><font size="2">键盘类函数</font></td>
</tr>
<tr>
<td width="100%"><br>
<font size="2">获得当前整个键盘上所有按键的按下状态:GetKeyBoardState函数<br>
这个函数获得在调用时一刹那,整个键盘上哪些(个)键正处于按下状态。它传入一个包含256个元素的字节数组,在实参中写入数组的第一个元素地址,就会返回整个键盘上256个虚拟键的对应状态到字节数组的相应下标元素中。声明:<br>
Declare Function GetKeyboardState Lib "user32" (pbKeyState As Byte) As Long<br>
调用如:<br>
Dim lxn(0 To 255) As Byte<br>
Private Sub Timer1_Timer()<br>
GetKeyboardState lxn(0)<br>
If lxn(66) And &H80 Then Unload Me<br>
If lxn(65) And &H80 Then MsgBox "你按下了字母A,它的虚拟键值为65."<br>
End Sub<br>
这个函数只一个参数pbKeyState,但很特别:它传入一个字节(Byte)数组,且这个数组应声明为下标0-255共256个元素,如--Dim lxnKey(0 to 255) As Byte。然后在实参写入其第一个元素lxnKey(0):为x=GetKeyboardState(lxnKey(0));这时,整个lxnKey数组就全部被写入了返回值,且是有顺序的--对应按键的值写入对应下标的元素中,如下标为65的元素lxnKey(65)中就放入A键的状态值;lxnKey(66)中放入B键的状态值,lxnKey(49)放入数字1键的状态值等。<br>
每个按键的状态值原本是用二进制值表示的,如果某个键当时正按下,则返回值的位7为1;如已经抬起,则为0;如果开关键打开,则位0设为1(开关键包括CapsLock, NumLock, ScrollLock);说明:位7 ?位0 ?一个字节数用二进制表示有八位,如10010011,从右向左第一位叫位0(相当于十进制的个位),第二位叫位1(相当于十进制中的十位),最左边的就是位7(虽然象有八位--但因第一位从0开始)。也就是说,如果一个按键正按下,那么对应的返回值就为二进制10000000(十进制128或十六进制&H80),但如果此时键盘上有开关键处于打开,则有可能就为10000001(十进制129或十六进制&H81)等。 一般地,我们对有位的内容的,应先想到位操作:--要检测某个二进制值的位7是否为1,只要将它与&H80进行AND操作,然后看结果是否非0就可以了,为什么呢?我们知道,&H80二进制值为10000000,一个数与之进行AND操作:101001 and 1000000,如果这个数的位7不为1,那么结果总是是0的,自己看看便明白,也有一种土办法:直接用十进制值如128,再编一个十进制化二进制的模块来化一下--那可是能检测任意位上的值哦!<br>
------------------------------------------------------<br>
判断是否按下了特定的键:GetKeyState函数<br>
这个函数常用于给程序定义系统级热键,它支持同时检测多个按键是否被一起按下,声明:<br>
Declare Function GetKeyState Lib "user32" (ByVal nVirtKey As Long) As Integer<br>
参数很简单,只要传入特定键的虚拟键码即可,关于虚拟键码--就是API浏览器中VK_类的常数,而一般字母、数字就用其ASCII码值(注意要用大写字母的ASCII值),如keys=GetKeyState(Asc("A"))不要写成keys=GetKeyState(Asc("a"))!有趣的是也可以检测鼠标按键是否按下,声明键码VK_LBUTTON(左键),VK_RBUTTON(右键)传入即可,如:<br>
Dim keys As Integer<br>
keys = GetKeyState(VK_CONTROL) '检测是否按下Ctrl键<br>
If keys And &H8000 Then '如果按下Ctrl键,则返回值keys的二进制位15值1.<br>
keys = GetKeyState(VK_MENU) '如果接连又按下Alt键.<br>
If keys And &H8000 Then 'keys第15位是否为1,:&H8000=(1000000000000000)2<br>
MsgBox "你同时按下了Ctrl+Alt热键."<br>
End If<br>
End If <br>
该函数的返回值为一个Integer型数(双字节),要判断是否按下特定键,就看返回值,如果开关键打开,则位0设为1(开关键包括CapsLock, NumLock,ScrollLock);即(0000000000000001)2,如果某键正处于按下状态,则位15为1;即(1000000000000000)2,如已经抬起,则为0。<br>
问题:按函数的说明,该函数应能检测任意一个按键是否被按下,但我却发现它对个别键不能区分,如数字小键盘上的数字键。<br>
-------------------------------------------------------<br>
判断是否正按下特定键:GetAsyncKeyState函数<br>
该函数与GetKeyState函数类似,都是判断特定键是否按下,但好象有一点观念上的不同,GetKeyState应在按过某键之后再调用,判断刚按过了某键,GetAsyncKeyState应在按下某键的同时调用,判断正在按下某键;而且,按一些资料上说,GetAsyncKeyState只限于本程序范围,不是系统级范围,但实际不是这样的,也可用它定义系统级热键。<br>
声明:<br>
Declare Function GetAsyncKeyState Lib "user32" (ByVal vKey As Long) As Integer<br>
参数和返回值都和GetKeyState函数一样。<br>
下面是一个定义热键:Ctrl键+鼠标右键的例子(有趣),当按下Ctrl+鼠标右键时会弹出个对话框,当然用GetKeyState也可以:<br>
Private Sub Timer2_Timer()<br>
Dim keys As Integer<br>
keys = GetAsyncKeyState(VK_CONTROL)<br>
If keys And &H8000 Then<br>
keys = GetAsyncKeyState(VK_RBUTTON)<br>
If keys And &H8000 Then MsgBox "Hello,你好吗?"<br>
End If<br>
End Sub<br>
对该函数返回值的补充:返回值为2字节,自从对GetAsyncKeyState函数的上一次调用以来,如果键已被按过,则位0设为1;否则设为0。如果键目前处于按下状态,则位15设为1;如抬起,则为0。微软的win32手册指出:倘若输入焦点从属于与调用函数的输入线程不同的另一个输入线程,则返回值为0(例如,一旦另一个程序拥有焦点,则它应返回零)。证据显示,函数实际是在整个系统的范围内工作的。 <br>
--------------------------------------------------<br>
查询一个键的扫描码:MapVirtualKeyA函数<br>
该函数根据1个键的虚拟键码返回该键的扫描码,也可根据一个键的扫描码返回该键的虚拟键码,还可以已知虚拟键码求得该键的对应ASCII值。声明:<br>
Declare Function MapVirtualKey Lib "user32" Alias "MapVirtualKeyA" (ByVal wCode As Long, ByVal wMapType As Long) As Long<br>
第一个参数wCode为已知的一个虚拟键码(如果求的是虚拟键码,则是已知的扫描码值),第二个参数wMapType为0或1或2之一,为0-- 前一参数wCode是个虚拟键码。函数返回相应的扫描码;为1-- 第一个参数wCode是个扫描码。函数返回相应的虚拟键码;为2-- wCode是个虚拟键码。函数返回相应的ASCII值(未加Shift组合键)。<br>
函数返回值就是要求的扫描码(或虚拟键码)。注:对不同类型的键盘,其扫描码是各不相同的,而对到达Windows后的虚拟键码,则所有电脑上全部都统一了。<br>
调用如:我想知道我的这个键盘上的Ctrl键的扫描码是多少。<br>
x& = MapVirtualKey(VK_CONTROL, 0)<br>
Print x&<br>
-------------------------------------------------------<br>
取得键盘上一个键的物理键名:GetKeyNameTextA函数<br>
由于各键盘型号不同,所以要确定一个键盘上具体某个键的名称,要依靠其扫描码,声明:<br>
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?