找回密码
 加入我们

QQ登录

只需一步,快速开始

搜索
查看: 6028|回复: 5

[原创]马大哈系列功能模块-----全局热键类(VB6.0)

[复制链接]

275

主题

3019

回帖

1

精华

管理员

嗷嗷叫的老马

积分
17066

论坛牛人贡献奖关注奖最佳版主进步奖人气王疯狂作品奖精英奖赞助论坛勋章乐于助人勋章

QQ
发表于 2007-3-5 21:16:36 | 显示全部楼层 |阅读模式

改自老外的一个模块,添加了热键管理功能,并封装为一个类.

部分代码如下:

  1. '*************************************************************************
  2. '**模 块 名:cHotKey
  3. '**说    明:定义全局热键
  4. '**创 建 人:马大哈 http://www.m5home.com/
  5. '**日    期:2006年7月19日
  6. '**版    本:V1.0
  7. '*************************************************************************
  8. Option Explicit

  9. Public Function AddHotKey(ByVal HotKey As vbKeyAll, Optional ByVal hCtrl As Boolean = False, Optional ByVal hAlt As Boolean = False, Optional ByVal hShift As Boolean = False) As Boolean
  10.     '添加热键
  11.     '如果返回值非零,则成功
  12.     Dim I As Long
  13.     Dim J As Long
  14.     Dim K As Long
  15.    
  16.     AddHotKey = False
  17.     I = InHotValue(HotKey)
  18.    
  19.     If I <> -1 Then      '如果按键已经有了,再判断一下控制键
  20.         If hCtrls(I) = hCtrl And hShifts(I) = hShift Then       '如果控制键也相同,那就已经定义过了,退出
  21.             Exit Function
  22.         End If
  23.     End If
  24.    
  25.     ReDim Preserve HotKeys(UBound(HotKeys) + 1)
  26.     ReDim Preserve KeyAtom(UBound(KeyAtom) + 1)
  27.     ReDim Preserve hCtrls(UBound(hCtrls) + 1)
  28.     ReDim Preserve hAlts(UBound(hAlts) + 1)
  29.     ReDim Preserve hShifts(UBound(hShifts) + 1)
  30.    
  31.     HotKeys(UBound(HotKeys)) = HotKey
  32.     KeyAtom(UBound(KeyAtom)) = GlobalAddAtom(GetTmpStr(16))
  33.     hCtrls(UBound(hCtrls)) = hCtrl
  34.     hAlts(UBound(hAlts)) = hAlt
  35.     hShifts(UBound(hShifts)) = hShift
  36.    
  37.     J = IIf(hCtrl = True, MOD_CONTROL, 0)       '组合控制键
  38.     K = J
  39.     J = IIf(hAlt = True, MOD_ALT, 0)
  40.     K = IIf(J = 0, K, K Or J)
  41.     J = IIf(hShift = True, MOD_SHIFT, 0)
  42.     K = IIf(J = 0, K, K Or J)
  43.    
  44.     I = RegisterHotKey(mfrmHwnd, KeyAtom(UBound(KeyAtom)), K, HotKey)
  45.     AddHotKey = I
  46.    
  47.     Debug.Print "HotKeyRegister:  " & I
  48.    
  49.     If I = 0 Then           '注册失败,就删除这个热键
  50.         Call DelHotKey(HotKey, hCtrl, hAlt, hShift)
  51.         MsgBox "注册热键失败!", vbOKOnly Or vbExclamation
  52.     End If
  53. End Function

  54. Public Function DelHotKey(ByVal HotKey As Long, Optional ByVal hCtrl As Boolean = False, Optional ByVal hAlt As Boolean = False, Optional ByVal hShift As Boolean = False) As Boolean
  55.     '删除热键
  56.     Dim I As Long, DelIndex As Long
  57.    
  58.     Dim tmpHotKeys() As Long                '交换用数组
  59.     Dim tmpKeyAtom() As Integer             '交换用数组
  60.     Dim tmphCtrls() As Boolean              '交换用数组
  61.     Dim tmphAlts() As Boolean                '交换用数组
  62.     Dim tmphShifts() As Boolean              '交换用数组
  63.    
  64.     On Error Resume Next
  65.    
  66.     DelHotKey = False
  67.     DelIndex = InHotValue(HotKey, hCtrl, hAlt, hShift)        '取得索引
  68.    
  69.     If DelIndex = -1 Then Exit Function             '判断热键
  70.     If hCtrl <> hCtrls(DelIndex) Then Exit Function
  71.     If hAlt <> hAlts(DelIndex) Then Exit Function
  72.     If hShift <> hShifts(DelIndex) Then Exit Function
  73.    
  74.     UnregisterHotKey mfrmHwnd, KeyAtom(DelIndex)             '先删除热键
  75.     GlobalDeleteAtom KeyAtom(DelIndex)                      '再删除原子
  76.    
  77.     ReDim tmpHotKeys(I)           '初始化临时数组
  78.     ReDim tmpKeyAtom(I)
  79.     ReDim tmphCtrls(I)
  80.     ReDim tmphAlts(I)
  81.     ReDim tmphShifts(I)
  82.    
  83.     For I = 1 To UBound(HotKeys)            '把内容倒到临时数组内
  84.         If I <> DelIndex Then
  85.             ReDim tmpHotKeys(UBound(tmpHotKeys) + 1)
  86.             ReDim tmpKeyAtom(UBound(tmpKeyAtom) + 1)
  87.             ReDim tmphCtrls(UBound(tmphCtrls) + 1)
  88.             ReDim tmphAlts(UBound(tmphAlts) + 1)
  89.             ReDim tmphShifts(UBound(tmphShifts) + 1)
  90.             
  91.             tmpHotKeys(UBound(tmpHotKeys)) = HotKeys(I)
  92.             tmpKeyAtom(UBound(tmpKeyAtom)) = KeyAtom(I)
  93.             tmphCtrls(UBound(tmphCtrls)) = hCtrls(I)
  94.             tmphAlts(UBound(tmphAlts)) = hAlts(I)
  95.             tmphShifts(UBound(tmphShifts)) = hShifts(I)
  96.         End If
  97.     Next I
  98.    
  99.     I = UBound(tmpHotKeys)
  100.    
  101.     ReDim HotKeys(I)           '重定义数组大小,原内容不保存
  102.     ReDim KeyAtom(I)
  103.     ReDim hCtrls(I)
  104.     ReDim hAlts(I)
  105.     ReDim hShifts(I)
  106.     HotKeys = tmpHotKeys         '再把调整后的内容倒回原数组
  107.     KeyAtom = tmpKeyAtom
  108.     hCtrls = tmphCtrls
  109.     hAlts = tmphAlts
  110.     hShifts = tmphShifts
  111.    
  112.     DelHotKey = True
  113. End Function
  114. Private Function InHotValue(ByVal HotValue As Long, Optional ByVal hCtrl As Boolean = False, Optional ByVal hAlt As Boolean = False, Optional ByVal hShift As Boolean = False) As Long
  115.     '判断热键值是否定义过
  116.     '返回值:-1表示没有定义过,否则返回索引值
  117.     Dim I As Long
  118.    
  119.     InHotValue = -1
  120.    
  121.     For I = 1 To UBound(HotKeys)
  122.         If HotKeys(I) = HotValue Then       '先判断按键
  123.             If hCtrl = hCtrls(I) And _
  124.                hAlt = hAlts(I) And _
  125.                hShift = hShifts(I) Then         '再判断功能键
  126.                 InHotValue = I
  127.                 Exit For
  128.             End If
  129.         End If
  130.     Next I
  131. End Function
复制代码
示例工程在此下载:

http://www.m5home.com/blog2/blogview.asp?logID=202

修正版代码及工程在此下载:

http://www.m5home.com/blog/article.asp?id=183

(***********已经修正,可以下载.....*******)
我就是嗷嗷叫的老马了......

275

主题

3019

回帖

1

精华

管理员

嗷嗷叫的老马

积分
17066

论坛牛人贡献奖关注奖最佳版主进步奖人气王疯狂作品奖精英奖赞助论坛勋章乐于助人勋章

QQ
 楼主| 发表于 2008-10-27 00:12:15 | 显示全部楼层
<p>修正了......</p>
<p>&nbsp;</p>
<p>因为版面经过调整,有些地址也改变了.....</p>
<p>&nbsp;</p>
<p>由于没人看,看了的又很少反馈,因此我也不知道哪些不对头了....哎.</p>
我就是嗷嗷叫的老马了......

7

主题

36

回帖

0

精华

银牌会员

积分
577
发表于 2009-5-12 08:30:46 | 显示全部楼层
我提个让大家发笑的问,热键类的作用是什么呢?
IF 你看到了我贴子的全部内容 Then 你点击了我发的贴子 SO 请你发表你的看法吧!阿门! Else 请打开我的贴子... 阅读... 留言吧! End if 我,来自绵阳...

275

主题

3019

回帖

1

精华

管理员

嗷嗷叫的老马

积分
17066

论坛牛人贡献奖关注奖最佳版主进步奖人气王疯狂作品奖精英奖赞助论坛勋章乐于助人勋章

QQ
 楼主| 发表于 2009-5-12 13:29:29 | 显示全部楼层
<p>QQ默认的消息提取热键是Ctrl + Alt + Z,按这三个键就能提取消息.</p>
<p>&nbsp;</p>
<p>它们就是热键.</p>
<p>&nbsp;</p>
<p>这个类方便了热键的定义.</p>
我就是嗷嗷叫的老马了......

1

主题

9

回帖

0

精华

铜牌会员

积分
139
发表于 2010-2-13 02:51:37 | 显示全部楼层
这个论坛确实值得常来很多资源值得研究

76

主题

375

回帖

0

精华

铜牌会员

积分
231
发表于 2010-2-20 20:09:13 | 显示全部楼层
本帖最后由 everyone 于 2011-7-20 16:31 编辑

{:soso_e100:}
您需要登录后才可以回帖 登录 | 加入我们

本版积分规则

快速回复 返回顶部 返回列表