VB 系统热键实现(模块)

调用方法很简单,在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

 

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值