请问怎样在 VB 中设置系统热键?

请问怎样在 VB 中设置系统热键?,第1张

用 VB 实现全局热键模块

调用全局热键的示例:

激活 3 个热键:(注:SetHotkey 是我自定义的函数)

SetHotkey 1, "Ctrl,112", "Add" 按 Ctrl+F1 激活指定程序

SetHotkey 2, 113, "Add" 按 F2 激活指定程序

SetHotkey 3, "Ctrl+Alt,113", "Add" 按 Ctrl+Alt+F2 激活指定程序

注释:注:关于激活热键后的 *** 作,由自定义函数 SetHotkey 的 KeyId 传送的值来判断

注销 3 个热键:

SetHotkey 1, "", "Del" 退出程序是一定要用上的,不然会导至程序死掉

SetHotkey 2, "", "Del"

SetHotkey 3, "", "Del"

请大家新建一个模块(.bas)文件,自定义 SetHotkey函数及其他,这样在以后的任何程序中只要调用此模块就可以了。

注释:本模块是有关热键 *** 作的

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

最简单的方法是按Ctrl+E打开菜单编辑器,然后设置个菜单项为退出什么的,设置其快捷键为Ctrl+D,勾选掉“可见”属性(如果是“不可见”属性请勾上)。然后运行就可以了。

还有的方法:(代码)

方法①:

Private

Sub

Form_KeyDown(KeyCode

As

Integer,

Shift

As

Integer)

Me.KeyPreview

=

True

If

KeyCode

=

vbKeyD

And

Shift

=

2

Then

End

End

Sub

方法②:

Private

Sub

Form_KeyUp(KeyCode

As

Integer,

Shift

As

Integer)

Me.KeyPreview

=

True

If

KeyCode

=

vbKeyD

And

Shift

=

2

Then

End

End

Sub

方法③:

Private

Sub

Form_KeyPress(KeyAscii

As

Integer)

If

KeyAscii

=

4

Then

End

End

Sub

方法①②③的灵敏度不一样,③里面的KeyAscii=4是Ctrl+D的Ascii值,是测试出来的。

至于Ascii值测试代码,只要将方法③的语句换为MsgBox

KeyAscii就行了


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/tougao/11151838.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-14
下一篇 2023-05-14

发表评论

登录后才能评论

评论列表(0条)

保存