计算机二级VB基础:VB系统热键实现方法
来源:优易学  2011-12-10 19:49:43   【优易学:中国教育考试门户网】   资料下载   IT书店
  调用方法很简单,在Form中如下书写代码:
  Private Sub Form_Load()
  SetHotkey 1, "Ctrl,112", "Add" ’按 Ctrl+F1 激活指定程序,F1的Ascii码为112
  SetHotkey 2, 113, "Add" ’按 F2 激活指定程序,F2的Ascii码为113
  SetHotkey 3, "Ctrl+Alt,113", "Add" ’按 Ctrl+Alt+F2 激活指定程序,F2的Ascii码为113
  End Sub
  Private Sub Form_Unload(Cancel As Integer)
  SetHotkey 1, "", "Del" ’退出程序是一定要用上的,不然会导至程序死掉
  SetHotkey 2, "", "Del"
  SetHotkey 3, "", "Del"
  End Sub
  在项目中新建一个模块(bas文件),然后代码如下(此模块中需要我们修改的是Function keyWndproc(),这里的代码实现的是当系统中按了热键后的调用代码):
  Option Explicit
  Private Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
  Private Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long) As Long
  Private 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
  Private Declare Function RegisterHotKey Lib "user32" (ByVal hwnd As Long, ByVal id As Long, ByVal fskey_Modifiers As Long, ByVal vk As Long) As Long
  Private Declare Function UnregisterHotKey Lib "user32" (ByVal hwnd As Long, ByVal id As Long) As Long
  Const WM_HOTKEY = &H312
  Const MOD_ALT = &H1
  Const MOD_CONTROL = &H2
  Const MOD_SHIFT = &H4
  Const GWL_WNDPROC = (-4) ’窗口函数的地址
  Dim key_preWinProc As Long ’用来保存窗口信息
  Dim key_Modifiers As Long, key_uVirtKey As Long, key_idHotKey As Long
  Dim key_IsWinAddress As Boolean ’是否取得窗口信息的判断
  Function keyWndproc(ByVal hwnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
  If Msg = WM_HOTKEY Then
  Select Case wParam ’wParam 值就是 key_idHotKey
  Case 1 ’激活 3 个热键后,3 个热键所对应的操作,考试,大提示在其他的程序中,只要修改此处就可以了.
  MsgBox "aa"
  Case 2
  MsgBox "bb"
  Case 3
  MsgBox "cc"
  End Select
  End If
  ’将消息传送给指定的窗口
  keyWndproc = CallWindowProc(key_preWinProc, hwnd, Msg, wParam, lParam)
  End Function
  Function SetHotkey(ByVal KeyId As Long, ByVal KeyAss0 As String, ByVal Action As String)
  Dim KeyAss1 As Long
  Dim KeyAss2 As String
  Dim i As Long
  i = InStr(1, KeyAss0, ",")
  If i = 0 Then
  KeyAss1 = Val(KeyAss0)
  KeyAss2 = ""
  Else
  KeyAss1 = Right(KeyAss0, Len(KeyAss0) - i)
  KeyAss2 = Left(KeyAss0, i - 1)
  End If
  key_idHotKey = 0
  key_Modifiers = 0
  key_uVirtKey = 0
  If key_IsWinAddress = False Then ’判断是否需要取得窗口信息,如果重复取得,再最后恢复窗口时,将会造成程序死掉
  ’记录原来的window程序地址
  key_preWinProc = GetWindowLong(Form1.hwnd, GWL_WNDPROC)
  ’用自定义程序代替原来的window程序
  SetWindowLong Form1.hwnd, GWL_WNDPROC, AddressOf keyWndproc
  End If
  key_idHotKey = KeyId
  Select Case Action
  Case "Add"
  If KeyAss2 = "Ctrl" Then key_Modifiers = MOD_CONTROL
  If KeyAss2 = "Alt" Then key_Modifiers = MOD_ALT
  If KeyAss2 = "Shift" Then key_Modifiers = MOD_SHIFT
  If KeyAss2 = "Ctrl+Alt" Then key_Modifiers = MOD_CONTROL + MOD_ALT
  If KeyAss2 = "Ctrl+Shift" Then key_Modifiers = MOD_CONTROL + MOD_SHIFT
  If KeyAss2 = "Ctrl+Alt+Shift" Then key_Modifiers = MOD_CONTROL + MOD_ALT + MOD_SHIFT
  If KeyAss2 = "Shift+Alt" Then key_Modifiers = MOD_SHIFT + MOD_ALT
  key_uVirtKey = Val(KeyAss1)
  RegisterHotKey Form1.hwnd, key_idHotKey, key_Modifiers, key_uVirtKey ’向窗口注册系统热键
  key_IsWinAddress = True ’不需要再取得窗口信息
  Case "Del"
  SetWindowLong Form1.hwnd, GWL_WNDPROC, key_preWinProc ’恢复窗口信息
  UnregisterHotKey Form1.hwnd, key_uVirtKey ’取消系统热键
  key_IsWinAddress = False ’可以再次取得窗口信息
  End Select
  End Function

责任编辑:小草

文章搜索:
 相关文章
热点资讯
资讯快报
热门课程培训