VB作的挂中加入热键
来源:互联网 发布:淘宝投诉结果 编辑:程序博客网 时间:2024/06/02 04:35
在vb作的挂中加入热键,本文提供了一个简便的解决办法。
一、问题的提出
从 DOS 时代开始写程序的同学,对于热键的功能应该不陌生,在 DOS
时代我们往往会撰写系统常驻程序借进行热键盘的操作,随时检测用户的按键盘情况,然后根据所按的按键盘决定执行的程序。
现在到了 Windows 的时代,键盘的中断已经交由 Windows 统一管理,因此程序无法再拦载"键盘的中断",那么在 Windows
中如何实现热键盘的操作呢?
二、问题的解决
方法(1):通过 API 函数 GetAsyncKeyState(判断函数调用时指定虚拟键的状态)、和 Timer(时间控件),来实现热键的操作
例子:用热键 F2 调用 MsgBox。
Private Declare Function GetAsyncKeyState Lib "user32" (ByVal vkey As
Long) As Integer
Private Sub Form_Load()
Timer1.Interval = 1 注释:设置检测间隔时间
End Sub
Private Sub Timer1_Timer()
If MyHotKey(vbKeyF2) Then MsgBox "热键调用成功!!", vbOKOnly
End Sub
Long) As Integer
Private Sub Form_Load()
Timer1.Interval = 1 注释:设置检测间隔时间
End Sub
Private Sub Timer1_Timer()
If MyHotKey(vbKeyF2) Then MsgBox "热键调用成功!!", vbOKOnly
End Sub
小结:用这个方法只需要调用一个 API 函数,比较简单,但是由于使用的是 Timer
控件来实现按键的监视,如果监视间隔时间过短,就会造成系统资源的浪费;如果间隔时间过长,按键就可能漏掉。
方法(2):通过 API 函数 RegisterHotKey(向系统注册相应的热键)、WndProc(消息处理)等等,来实现热键的操作。
例子:由于代码太多,请大家查看软件报 2000 年 第 48 期的文章<<再谈热键编程>>
小结:这种方法需要调用调用 6 个以上的 API
函数,需要定义多个常数(操作一个热键就要定义一个常数),对于一般的编程爱好者来说,过于复杂,不好掌握。
方法(3):通过调用 VC 编写的 DLL 文件。
由于 Windows 规定用以拦截全系统键盘消息的 HookProc Callback 函数必须放在 DLL 文件里面,但 VB 无法制作 DLL
文件(注:VB 可以用来制作 ActiveX DLL 文件,但 ActiveX DLL 与单纯的 DLL 不尽相同)。
我们这里调用王国荣先生用 VC 编写的 KeybHook.dll 文件(注:现在许多的有关热键操作的软件都是调用的这个 dll
文件,大家如果需要可到 。
例子:按键追踪程序(可以检测你按下的所有的键值)
Fomr1.frm 文件代码:
Option Explicit
Private Sub Form_Load()Sub Form_Load()
On Error Resume Next
注释:挂上 KeyboardHook_HookProc 函数
SetKeyboardHook Me.hWnd, WM_USER
If Err.Number <> 0 Then
MsgBox "请先将 KeybHook.dll 复制到 Windows 的所在路径!", vbCritical
End
End If
On Error GoTo 0
注释:挂上窗口程序
prevWndProc = GetWindowLong(Me.hWnd, GWL_WNDPROC)
SetWindowLong Me.hWnd, GWL_WNDPROC, AddressOf WndProc
End Sub
Private Sub Form_Unload()Sub Form_Unload(Cancel As Integer)
注释:卸下 KeyboardHook_HookProc 函数
ReleaseKeyboardHook
注释:卸下窗口程序
SetWindowLong Me.hWnd, GWL_WNDPROC, prevWndProc
End Sub
Module1.bas 文件代码:
Option Explicit
Public Const GWL_WNDPROC = (-4)
Public Const WM_USER = &H400
Declare Function CallWindowProc()Function CallWindowProc Lib "user32" Alias "CallWindowProcA"
(ByVal lpPrevWndFunc As Long, ByVal hWnd As Long, ByVal Msg As Long, ByVal
wParam As Long, ByVal lParam As Long) As Long
Declare Function GetWindowLong()Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal
hWnd As Long, ByVal nIndex As Long) As Long
Declare Function SetWindowLong()Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal
hWnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Declare Function SetKeyboardHook()Function SetKeyboardHook Lib "KeybHook" (ByVal hwndPost As Long,
ByVal Msg As Long) As Long
Declare Function ReleaseKeyboardHook()Function ReleaseKeyboardHook Lib "KeybHook" () As Long
Public prevWndProc As Long
Dim IsCtrlDown As Boolean
Function WndProc()Function WndProc(ByVal hWnd As Long, ByVal Msg As Long, ByVal wParam As
Long, ByVal lParam As Long) As Long
If Msg = WM_USER Then
Form1.List1.AddItem "wParam=" & wParam & ", lParam=" & Hex(lParam)
Form1.List1.ListIndex = Form1.List1.NewIndex
If wParam = 65 And (lParam And &H80000000) <> 0 Then MsgBox
"热键调用成功!!", vbOKOnly
注释:判断按键情况,对于你所按的按键的键值可通过本程序查看到
If wParam = 66 And (lParam And &H80000000) <> 0 And IsCtrlDown Then
MsgBox "组合热键调用成功!!", vbOKOnly, "组合键情况"
注释:判断按键情况(组合键情况)
End If
WndProc = CallWindowProc(prevWndProc, hWnd, Msg, wParam, lParam)
End Function
Option Explicit
Private Sub Form_Load()Sub Form_Load()
On Error Resume Next
注释:挂上 KeyboardHook_HookProc 函数
SetKeyboardHook Me.hWnd, WM_USER
If Err.Number <> 0 Then
MsgBox "请先将 KeybHook.dll 复制到 Windows 的所在路径!", vbCritical
End
End If
On Error GoTo 0
注释:挂上窗口程序
prevWndProc = GetWindowLong(Me.hWnd, GWL_WNDPROC)
SetWindowLong Me.hWnd, GWL_WNDPROC, AddressOf WndProc
End Sub
Private Sub Form_Unload()Sub Form_Unload(Cancel As Integer)
注释:卸下 KeyboardHook_HookProc 函数
ReleaseKeyboardHook
注释:卸下窗口程序
SetWindowLong Me.hWnd, GWL_WNDPROC, prevWndProc
End Sub
Module1.bas 文件代码:
Option Explicit
Public Const GWL_WNDPROC = (-4)
Public Const WM_USER = &H400
Declare Function CallWindowProc()Function CallWindowProc Lib "user32" Alias "CallWindowProcA"
(ByVal lpPrevWndFunc As Long, ByVal hWnd As Long, ByVal Msg As Long, ByVal
wParam As Long, ByVal lParam As Long) As Long
Declare Function GetWindowLong()Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal
hWnd As Long, ByVal nIndex As Long) As Long
Declare Function SetWindowLong()Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal
hWnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Declare Function SetKeyboardHook()Function SetKeyboardHook Lib "KeybHook" (ByVal hwndPost As Long,
ByVal Msg As Long) As Long
Declare Function ReleaseKeyboardHook()Function ReleaseKeyboardHook Lib "KeybHook" () As Long
Public prevWndProc As Long
Dim IsCtrlDown As Boolean
Function WndProc()Function WndProc(ByVal hWnd As Long, ByVal Msg As Long, ByVal wParam As
Long, ByVal lParam As Long) As Long
If Msg = WM_USER Then
Form1.List1.AddItem "wParam=" & wParam & ", lParam=" & Hex(lParam)
Form1.List1.ListIndex = Form1.List1.NewIndex
If wParam = 65 And (lParam And &H80000000) <> 0 Then MsgBox
"热键调用成功!!", vbOKOnly
注释:判断按键情况,对于你所按的按键的键值可通过本程序查看到
If wParam = 66 And (lParam And &H80000000) <> 0 And IsCtrlDown Then
MsgBox "组合热键调用成功!!", vbOKOnly, "组合键情况"
注释:判断按键情况(组合键情况)
End If
WndProc = CallWindowProc(prevWndProc, hWnd, Msg, wParam, lParam)
End Function
小结:用这种方法,就我而言感觉是最好的,可以很方便的检测按键,不需要事先用常量定义,不需要时间控件,也可方便的定义组合键。
以上程序在 VB6.0、Windows XP下调试通过。
- VB作的挂中加入热键
- VB程序中注册自定义的热键
- 使用VB在应用程序中注册热键
- VB在程序中注册热键
- 使用VB在应用程序中注册热键
- 使用VB在应用程序中注册热键
- 详解VB中系统热键使用
- API中VB字符串作参数传递的本质论
- 如何在webform中为button加入热键?
- [VB.NET]请问如何在vb.net的菜单中加入小图标并为它们加入背景色?
- VB 全局热键
- VB热键注册
- delphi热键:delphi程序中定义热键的方法 --转
- VB源码函数UTF8Encode UTF8编码,原内容中有URLENCODE内容的不作更改
- 在PB中实现热键的方法
- 程序中使用热键的实现
- 在PB中实现热键的方法
- 解决vs2010中写vb代码时按'''不自动加入函数注释的问题
- 《程序员》06年8期:[特别策划]杂谈:我的25年嵌入式生涯
- 多线程并发处理
- 软考结束
- Improving .NET Application Performance and Scalability
- [转]编程是一门艺术吗?
- VB作的挂中加入热键
- 健康知识讲座
- 性格的成熟 思想的成熟
- 发一些无聊的东西来凑下数量
- 九种分时形态应对技法
- 宏观的思考问题
- gl ,shader笔记
- 今天是我第一次写blog
- Dweep流程攻略