|
我们使用的大多数软件几乎都有快捷键,比如photoshop里面的快捷键给我们提供了很大的便捷。怎么才能让我们做的程序也具备这个功能呢,下面让我们来看一个实例。 '这里是模块代码,放到标准模块中 Option Explicit
'声明API Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long) As Long Declare 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 RegisterHotKey Lib "user32" (ByVal hwnd As Long, ByVal id As Long, ByVal fsModifiers As Long, ByVal vk As Long) As Long Declare Function UnregisterHotKey Lib "user32" (ByVal hwnd As Long, ByVal id As Long) As Long
'定义常量 Public Const WM_HOTKEY = &H312 Public Const MOD_ALT = &H1 Public Const MOD_CONTROL = &H2 Public Const MOD_SHIFT = &H4 Public Const GWL_WNDPROC = (-4)
Public preWinProc As Long Public Modifiers As Long, uVirtKey1 As Long, idHotKey As Long
Private Type taLong ll As Long End Type
Private Type t2Int lWord As Integer hword As Integer End Type
Public Function wndproc(ByVal hwnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long Dim lp As taLong, i2 As t2Int
If Msg = WM_HOTKEY Then If wParam = idHotKey Then lp.ll = lParam LSet i2 = lp If (i2.lWord = Modifiers) And i2.hword = uVirtKey1 Then '------------------------------------------------------ '这里是快捷键代码,你可以随便改 Form1.Visible = Not Form1.Visible '------------------------------------------------------ End If End If End If '如果不是热键信息则调用原来的程序 wndproc = CallWindowProc(preWinProc, hwnd, Msg, wParam, lParam) End Function
'这里是窗体代码 Option Explicit
Private Sub Form_Load() Dim ret As Long '记录原来的window程序地址 preWinProc = GetWindowLong(Me.hwnd, GWL_WNDPROC) '用自定义程序代替原来的window程序 ret = SetWindowLong(Me.hwnd, GWL_WNDPROC, AddressOf wndproc) idHotKey = 1 'in the range &h0000 through &hBFFF Modifiers = MOD_ALT '辅助键为Alt uVirtKey1 = vbKeyP '注册的热键为Alt+P '注册热键 ret = RegisterHotKey(Me.hwnd, idHotKey, Modifiers, uVirtKey1) If ret = 0 Then MsgBox "注册热键失败,请使用其它热键!", vbCritical, "Error" End If End Sub
Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer) Dim ret As Long '取消Message的截取,使之送往原来的window程序 ret = SetWindowLong(Me.hwnd, GWL_WNDPROC, preWinProc) Call UnregisterHotKey(Me.hwnd, uVirtKey1) End Sub '----------------------------------------------------------------------------------------------------------------- vbKeyP 这里的P可以改成你要的按键,(A~Z) Public Const MOD_ALT = &H1 '辅助键为ALT Public Const MOD_CONTROL = &H2 '辅助键为CTRL Public Const MOD_SHIFT = &H4 '辅助键为SHIFT,这几个键都可以用,注意如果某几个键的组合已被注册为快捷键那再次注册的话就会失败,正式的程序中要有这种情况的处理程序。 |