对VB注册全局热键的思考——是不是RegisterHotKey的1个ID可以注册多组热键?

最近在网络上看到用VB注册热键的代码,试了下,觉得很好用。经过一番分析,我又简化了一下源代码,把没有必要的代码删去,还是能成功。由此引发了一些思考,是不是RegisterHotKeyr的1个ID可以注册多组热键?

网络原代码的原理是,用api函数RegisterHotKey注册一个ID为1的全局热键,当系统收到ID为1的热键是触发程序定义代码。原代码中包含了收到ID为1的全局热键后,对热键消息的 lParam参数进行分析,判断是否是注册时的键值,然后再执行定义程序。我把这个判断删除了**(下面代码中加粗部分)**。也能实现全局热键目的。所以引发我一个思考:是不是 RegisterHotKey(Me.hwnd, idHotKey, Modifiers, uVirtKey)里同一个idHotKey,可以注册多个uVirtKey?然后再对收到的信息中 lParam参数进行分析,判断是哪组热键,从而执行相对应的程序代码。

我做了些试验,没试出来,如果有人知道,真心请教指点一二。谢谢!

下面我把源码分享一下,其中改为注释的是我删除的源代码。
新建立一个FORM~

Private Sub Form_Load()
Dim ret As Long
preWinProc = GetWindowLong(Me.hwnd, GWL_WNDPROC)
ret = SetWindowLong(Me.hwnd, GWL_WNDPROC, AddressOf Wndproc)
idHotKey = 1
Modifiers = MOD_ALT + MOD_CONTROL
uVirtKey = vbKeyA
ret = RegisterHotKey(Me.hwnd, idHotKey, Modifiers, uVirtKey)
End Sub

Private Sub Form_Unload(Cancel As Integer)
Dim ret As Long
ret = SetWindowLong(Me.hwnd, GWL_WNDPROC, preWinProc)
Call UnregisterHotKey(Me.hwnd, uVirtKey)

End Sub

新建立一个模块

Option Explicit

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, uVirtKey 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
If Msg = WM_HOTKEY Then
If wParam = idHotKey Then
’Dim lp As taLong, i2 As t2Int
'lp.ll = lParam
'LSet i2 = lp
'If (i2.lWord = Modifiers) And i2.hWord = uVirtKey Then

msgbox “你按下了热键哦~”
’End If
End If
End If
Wndproc = CallWindowProc(preWinProc, hwnd, Msg, wParam, lParam)
End Function
rt.js/

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值