⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mk_mdl_hotkey.bas

📁 Game [HHSJ] Para Tool VB Code
💻 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 激活指定程序
'注释:注:关于激活热键后的操作,由自定义函数 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

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)  '注释:窗口函数的地址

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 '注释:向窗口注册系统热键
            key_IsWinAddress = True '注释:不需要再取得窗口信息
            
            mkJoinFrm mkFrm, KeyID, True
        Case "Del"
            SetWindowLong mkFrm.hwnd, GWL_WNDPROC, key_preWinProc '注释:恢复窗口信息
            UnregisterHotKey mkFrm.hwnd, key_uVirtKey '注释:取消系统热键
            key_IsWinAddress = False '注释:可以再次取得窗口信息
            mkJoinFrm mkFrm, KeyID, False
    End Select
End Function

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -