重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
RegisterHotKey这个API可以实现。
创新互联是网站建设技术企业,为成都企业提供专业的成都网站制作、成都网站建设、外贸营销网站建设,网站设计,网站制作,网站改版等技术服务。拥有十载丰富建站经验和众多成功案例,为您定制适合企业的网站。十载品质,值得信赖!
至于API声明,可以查查API大全。
Public Sub Hitjian()
Dim msgb As Msg
'注册Ctrl+E为热键
RegisterHotKey Main.hWnd, HBFFF, MOD_CONTROL, vbKeyE
Main.Show '显示Hot对象
HotKey_Flg = False
'循环检测
Do While Not HotKey_Flg
'等待消息
WaitMessage
'检测热键是否被按下
If PeekMessage(msgb, Main.hWnd, WM_HOTKEY, WM_HOTKEY, PM_REMOVE) Then
'这里可以填写事件
'Dim i As Long
'i = EnumWindows(AddressOf EnumWindowsProc, 0)
If JinJihuibiText "进行待机" Then
Shell JinJihuibiText, vbMaximizedFocus
Else
进行待机
End If
End If
'转让控制权,允许操作系统处理其他事件
DoEvents
Loop
End Sub
不清楚热键和快捷键是什么区别
1.如果你是指Chrl+S这样的快捷键,可以设置ShortCutKeys属性,属性窗口就有可视化编辑器。
2.如果你是指"保存(S)",其中s有下划线这样的用Alt+字母来访问的设置,应该在菜单项的Text属性中使用符号。符号后面的字母将被作为快速访问字符,显示的时候不会被显示出来,而字母会自动加上下划线。比如"保存(s)"。
3.和选中标记有关的属性有两个
CheckOnClick 在菜单项上单击时是否改变Checked属性
Checked 设置/获取 菜单项是否被选中
4.设置菜单项的Enabled属性为False
新建一模块,输入下列内容
'-------------------------------------
'系统热键模块
'------------------------------------
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
希望某一字符成为访问键,也可以在该字符前面加上一个 () 字符。
可以通过在 Caption 属性设置中使用 字符来为命令、菜单、和控件指定访问键。
单击按钮执行操作,在程序执行时,按 CommandButton 的快捷键(ALT + 带下划线的字母)是一种快捷键方法(见上图)。
access key(访问键),键盘上的字符,这些字符在菜单上或对话框中加有下划线或突出显示。同时按下 ALT 键和访问键可以激活菜单或对话框。有时候用来指代热键。
赋值访问键和快捷键:通过定义访问键和快捷键可改进键盘对菜单命令的访问。
访问键,访问键允许按下 ALT 键并打入一个指定字符来打开一个菜单。一旦菜单打开,通过按下所赋值的字符(访问键)可选取控件。例如,按下 ALT + E 键可打开“编辑”菜单,再按 P 键可选取“粘贴”菜单项。在菜单控件的标题中,一个指定的访问键表现为一个带下划线的字母,如图 6.9 所示。
图 6.9 访问键
要在菜单编辑器中给菜单控件赋值访问键,请按照以下步骤执行:
1.选取要赋值访问键的菜单项。
2.在其“标题”框中,在要作为访问键字符的前面直接键入一个 () 字符。
快捷键:
快捷键按下时会立刻运行一个菜单项。可以为频繁使用的菜单项指定一个快捷键,它提供一种键盘单步的访问方法,而不是按住 ALT 键、再按菜单标题访问字符,然后再按菜单项访问字符的三步方法。快捷键的赋值包括功能键与控制键的组合,如 CTRL + F1 键或CTRL + A 键。它们出现在菜单中相应菜单项的右边,如图 6.10 所示。
图 6.10 快捷健
要对菜单项赋值快捷键,请按照以下步骤执行:
1.打开“菜单编辑器”。
2.选取该菜单项。
3.在“快捷键”组合框中选取功能键或者键的组合。
要删除快捷键赋值,应选取列表顶部的 "(none)"。
把下面的代码复制到窗体的代码里就行了,这里注册的是QQ的默认热键,你先运行这个程序,再运行QQ,就会把QQ的默认热键屏蔽掉了。
Private
Declare
Function
RegisterHotKey
Lib
"user32"
(ByVal
hWnd
As
Long,
ByVal
id
As
Long,
ByVal
fsModifiers
As
Long,
ByVal
vk
As
Long)
As
Long
Private
Declare
Function
UnregisterHotKey
Lib
"user32"
(ByVal
hWnd
As
Long,
ByVal
id
As
Long)
As
Long
Private
Const
MOD_ALT
=
H1
'Alt键
Private
Const
MOD_CONTROL
=
H2
'Ctrl键
Private
Const
MOD_SHIFT
=
H4
'Shift键
Private
Sub
Form_Load()
Dim
ret
As
Long
ret
=
RegisterHotKey(Me.hWnd,
1,
MOD_ALT
+
MOD_CONTROL,
vbKeyZ)
'注册热键Ctrl+Alt+Z
If
ret
=
Then
MsgBox
"注册热键失败,请使用其它热键!",
vbCritical,
"错误"
End
If
End
Sub
Private
Sub
Form_QueryUnload(Cancel
As
Integer,
UnloadMode
As
Integer)
Dim
ret
As
Long
Call
UnregisterHotKey(Me.hWnd,
vbKeyZ)
End
Sub
检测热键是否按下,最好用PeekMessage函数。
注册热键时,最好把RegisterHotKey函数的第二个参数设为HBFFF以上的数。
程序结束时,应用UnregisterHotKey注销热键。
上面三条只是建议,不一定可以。