如果按键其中一个不是控制键的话,VB中必须用键盘钩子才能实现判断按下的是哪两个按键 建议不要研究用VB本身完成上述任务,使用API是很简单的 可以参考一些使用全局钩子的程序,下面是我写的一些代码,此全局钩子的代码改编自一位VB达人的钩子代码,此达人在VB不可能实现钩子的一片喊声中写出了下面的代码,没有使用DLL,虽然不知道他的名字,但是很感激他在我很茫然的时候给了我信心,那就是对VB的狂热! 努力吧兄弟,你会发现VB的天空是很美丽的!!!~~~ 1。公用代码写在模块中 Public Declare Function SetwindowsHookEx Lib "user32" Alias "SetwindowsHookExA" (ByVal idHook As Long,ByVal lpfn As Long,ByVal hmod As Long,ByVal dwThreadId As Long) As Long Public Declare Function CallNextHookEx Lib "user32" (ByVal hHook As Long,ByVal nCode As Long,ByVal wParam As Long,lParam As Any) As Long Public Declare Function UnhookWindowsHookEx Lib "user32" (ByVal hHook As Long) As Long Public Declare Function GetModuleHandle Lib "kernel32" Alias "GetModuleHandleA" (ByVal lpModuleName As String) As Long Public Declare Function GetProcAddress Lib "kernel32" (ByVal hModule As Long,ByVal lpProcName As String) As Long Public Declare Function SetwindowPos Lib "user32" (ByVal hwnd As Long,ByVal hWndInsertAfter As Long,ByVal X As Long,ByVal Y As Long,ByVal cx As Long,ByVal cy As Long,ByVal wFlags As Long) As Long Public Const HWND_TOPMOST = -1 Public Declare Sub copyMemory Lib "kernel32" Alias "RtlMoveMemory" (lpvDest As Any,ByVal lpvSource As Long,ByVal cbcopy As Long) Public Type KEYMSGS vKey As Long '虚拟码 (and &HFF) sKey As Long '扫描码 flag As Long '键按下:128 抬起:0 time As Long 'Window运行时间 End Type Public Declare Function GetKeyNameText Lib "user32" Alias "GetKeyNameTextA" (ByVal lParam As Long,ByVal lpBuffer As String,ByVal nSize As Long) As Long Public Declare Function GetKeyState Lib "user32" (ByVal nVirtKey As Long) As Integer Public strKeyName As String * 255 Public keyMsg As KEYMSGS Public Const Alt_Down = &H20 '消息 Public Const HC_ACTION = 0 Public Const HC_SYSMODALOFF = 5 Public Const HC_SYSMODALON = 4 '键盘消息 Public Const WM_KEYDOWN = &H100 Public Const WM_KEYUP = &H101 Public Const WM_SYSKEYDOWN = &H104 Public Const WM_SYSKEYUP = &H105 Public hHook As Long 2。钩子事件处理代码,写在模块中 '键盘钩子 Public Function CallKeyHookProc(ByVal code As Long,ByVal lParam As Long) As Long Dim lKey As Long Dim strKeyName As String * 255 Dim strLen As Long Dim 虚拟码 As Integer 'On Error GoTo CallKeyHookProcErr: If code = HC_ACTION Then copyMemory keyMsg,lParam,LenB(keyMsg) lKey = keyMsg.sKey And &HFF '扫描码 lKey = lKey * 65536 strLen = GetKeyNameText(lKey,strKeyName,250) 虚拟码 = CInt(Format(keyMsg.vKey And &HFF,"0")) Select Case wParam Case WM_SYSKEYDOWN,WM_KEYDOWN: GUN_CTRL.Text1.Text = "键名:" + Left(strKeyName,strLen) + " 虚拟码:" + Format(keyMsg.vKey And &HFF,"0") + " 扫描码:" + Format(lKey / 65536,"0") 'GUN_CTRL.Text2.Text = "" 'If (GetKeyState(vbKeyControl) And &H8000) Then ' GUN_CTRL.Text2.Text = GUN_CTRL.Text2.Text + "Ctrl " 'End If ' ' If (keyMsg.flag And Alt_Down) <> 0 Then ' GUN_CTRL.Text2.Text = GUN_CTRL.Text2.Text + "Alt " ' End If ' ' If (GetKeyState(vbKeyShift) And &H8000) Then ' GUN_CTRL.Text2.Text = GUN_CTRL.Text2.Text + "Shift" ' End If Select Case 虚拟码 Case 移动键(0) 移动标志(0) = True: CallKeyHookProc = 1 Case 移动键(1) 移动标志(1) = True: CallKeyHookProc = 1 Case 移动键(2) 移动标志(2) = True: CallKeyHookProc = 1 Case 移动键(3) 移动标志(3) = True: CallKeyHookProc = 1 Case 移动键(4) 移动标志(4) = True: CallKeyHookProc = 1 Case 移动键(5) 移动标志(5) = True: CallKeyHookProc = 1 Case 旋转键(0) 旋转标志(0) = True: CallKeyHookProc = 1 Case 旋转键(1) 旋转标志(1) = True: CallKeyHookProc = 1 Case 旋转键(2) 旋转标志(2) = True: CallKeyHookProc = 1 Case 旋转键(3) 旋转标志(3) = True: CallKeyHookProc = 1 Case 旋转键(4) 旋转标志(4) = True: CallKeyHookProc = 1 Case 旋转键(5) 旋转标志(5) = True: CallKeyHookProc = 1 Case 120 Call LoadKeySetting("F9"): CallKeyHookProc = 1 Case 121 Call LoadKeySetting("F10"): CallKeyHookProc = 1 Case 122 Call LoadKeySetting("F11"): CallKeyHookProc = 1 Case 123 Call LoadKeySetting("F12"): CallKeyHookProc = 1 Case 192 '数字键左边那个键 工作行程 <----> 辅助行程 If 当前行程状态 = 1 Then GUN_CTRL.工作_辅助行程Timer.Enabled = True: CallKeyHookProc = 1 ElseIf 当前行程状态 = 2 Then GUN_CTRL.工作_辅助行程Timer.Enabled = True: CallKeyHookProc = 1 End If Case 49,97,35 '数字键1,小键盘1 If 当前行程状态 = 0 Then ElseIf 当前行程状态 = 1 Then Else End If Case 50,98,40 '数字键2,小键盘2 If 当前行程状态 = 0 Then ElseIf 当前行程状态 = 1 Then Else End If Case 13 '回车 焊接 If 当前行程状态 = 1 Then GUN_CTRL.焊接Timer.Enabled = True: CallKeyHookProc = 1 ElseIf 当前行程状态 = 0 Then GUN_CTRL.焊接Timer.Enabled = True: CallKeyHookProc = 1 End If End Select Case WM_SYSKEYUP,WM_KEYUP: Select Case 虚拟码 Case 移动键(0) 移动标志(0) = False Case 移动键(1) 移动标志(1) = False Case 移动键(2) 移动标志(2) = False Case 移动键(3) 移动标志(3) = False Case 移动键(4) 移动标志(4) = False Case 移动键(5) 移动标志(5) = False Case 旋转键(0) 旋转标志(0) = False Case 旋转键(1) 旋转标志(1) = False Case 旋转键(2) 旋转标志(2) = False Case 旋转键(3) 旋转标志(3) = False Case 旋转键(4) 旋转标志(4) = False Case 旋转键(5) 旋转标志(5) = False End Select End Select End If If 移动标志(0) + 移动标志(1) + 移动标志(2) + 移动标志(3) + 移动标志(4) + 移动标志(5) = 0 Then GUN_CTRL.移动时钟.Enabled = False Else GUN_CTRL.移动时钟.Enabled = True End If If 旋转标志(0) + 旋转标志(1) + 旋转标志(2) + 旋转标志(3) + 旋转标志(4) + 旋转标志(5) = 0 Then GUN_CTRL.旋转时钟.Enabled = False Else GUN_CTRL.旋转时钟.Enabled = True End If 'CallKeyHookProc = 1 CallKeyHookProcErr: If code <> 0 Then CallKeyHookProc = CallNextHookEx(0,code,wParam,lParam) End If End Function 3。窗体中两个按钮分别完成开始钩子和结束钩子 Private Sub Form_Unload(Cancel As Integer) If hHook > 0 Then Call UnhookWindowsHookEx(hHook) End Sub Private Sub HookCommand_Click() '&H20A hHook = SetwindowsHookEx(2,AddressOf MyKBHook,App.ThreadID) End Sub Private Sub HookUnCommand_Click() If hHook > 0 Then Call UnhookWindowsHookEx(hHook) End Sub
原文地址:https://www.jb51.cc/vb/259841.html
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。