?? mk_mdl_hotkey.bas
字號:
Attribute VB_Name = "mdl_HotKey"
'\__________________________________________________________________________________
' SetHotkey 1, "Ctrl,112", "Add" '按 Ctrl+F1 激活指定程序
' SetHotkey 2, 113, "Add" '按 F2 激活指定程序
' SetHotkey 3, "Ctrl+Alt,113", "Add" '按 Ctrl+Alt+F2 激活指定程序
'注釋:注:關于激活熱鍵后的操作,由自定義函數(shù) SetHotkey 的 KeyId 傳送的值來判斷
'注銷 3 個熱鍵:
' SetHotkey 1, "", "Del" '退出程序是一定要用上的,不然會導至程序死掉
' SetHotkey 2, "", "Del"
' SetHotkey 3, "", "Del"
'請大家新建一個模塊(.bas)文件,自定義 SetHotkey函數(shù)及其他,這樣在以后的任何程序中只要調(diào)用此模塊就可以了。
'注釋: 本模塊是有關熱鍵操作的
'\____________________________________________________________________________________
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
Private Declare Function SetWindowPos Lib "user32" (ByVal hwnd As Long, ByVal hWndInsertAfter As Long, ByVal x As Long, ByVal y As Long, ByVal cx As Long, ByVal cy As Long, ByVal wFlags As Long) As Long
Const WM_HOTKEY = &H312
Const MOD_ALT = &H1
Const MOD_CONTROL = &H2
Const MOD_SHIFT = &H4
Const GWL_WNDPROC = (-4) '注釋:窗口函數(shù)的地址
Public Const HWND_TOPMOST = -1
Public Const SWP_NOMOVE = &H2
Public Const SWP_NOSIZE = &H1
Public Const SWP_FRAMECHANGED = &H20
'The frame changed: send WM_NCCALCSIZE
Public Const SWP_DRAWFRAME = SWP_FRAMECHANGED
Public Const HWND_BOTTOM = 1
Public Const HWND_BROADCAST = &HFFFF&
Public Const HWND_DESKTOP = 0
Public Const HWND_NOTOPMOST = -2
Public Const HWND_TOP = 0
Public Const SWP_HIDEWINDOW = &H80
Public Const SWP_NOACTIVATE = &H10
Public Const SWP_NOCOPYBITS = &H100
Public Const SWP_NOOWNERZORDER = &H200
'Don't do owner Z ordering
Public Const SWP_NOREDRAW = &H8
Public Const SWP_NOREPOSITION = SWP_NOOWNERZORDER
Public Const SWP_NOZORDER = &H4
Public Const SWP_SHOWWINDOW = &H40
Public Const Flags = SWP_DRAWFRAME Or SWP_NOMOVE Or SWP_NOSIZE
Dim frms(4) As Form
Dim key_preWinProc As Long '注釋:用來保存窗口信息
Dim key_Modifiers As Long, key_uVirtKey As Long, key_idHotKey As Long
Dim key_IsWinAddress As Boolean '注釋:是否取得窗口信息的判斷
Dim top_Result As Long
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 個熱鍵所對應的操作,大家在其他的程序中,只要修改此處就可以了
top_Result = SetWindowPos(hwnd, HWND_TOPMOST, 0, 0, 0, 0, Flags)
frms(1).WindowState = 0
frms(1).Show
Case 2
top_Result = SetWindowPos(hwnd, HWND_NOTOPMOST, 0, 0, 0, 0, Flags)
frms(1).Hide
Case 3
top_Result = SetWindowPos(hwnd, HWND_DESKTOP, 0, 0, 0, 0, Flags)
End Select
End If
'注釋: 將消息傳送給指定的窗口
keyWndproc = CallWindowProc(key_preWinProc, hwnd, Msg, wParam, lParam)
End Function
Function mkJoinFrm(ByVal frmTemp As Form, ByVal frmID As Long, ByVal isADD) As Long
Select Case frmID '注釋:wParam 值就是 key_idHotKey
Case 1
If isADD Then
Set frms(1) = frmTemp
Else
Set frms(1) = Nothing
End If
Case 2
If isADD Then
Set frms(3) = frmTemp
Else
Set frms(2) = Nothing
End If
Case 3
If isADD Then
Set frms(3) = frmTemp
Else
Set frms(3) = Nothing
End If
End Select
End Function
Function SetHotkey(ByVal mkFrm As Form, 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(mkFrm.hwnd, GWL_WNDPROC)
'注釋: 用自定義程序代替原來的window程序
SetWindowLong mkFrm.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 mkFrm.hwnd, key_idHotKey, key_Modifiers, key_uVirtKey '注釋:向窗口注冊系統(tǒng)熱鍵
key_IsWinAddress = True '注釋:不需要再取得窗口信息
mkJoinFrm mkFrm, KeyID, True
Case "Del"
SetWindowLong mkFrm.hwnd, GWL_WNDPROC, key_preWinProc '注釋:恢復窗口信息
UnregisterHotKey mkFrm.hwnd, key_uVirtKey '注釋:取消系統(tǒng)熱鍵
key_IsWinAddress = False '注釋:可以再次取得窗口信息
mkJoinFrm mkFrm, KeyID, False
End Select
End Function
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -