你的代码很好,谢谢了,改天请你吃烧烤

解决方案 »

  1.   

    呵呵,我API蛮差劲,搞个F10激活,F11隐藏的全局热键搞几天没出来,他的代码帮了忙了
    这些估计你们都晓得
      

  2.   

    '模块代码
    Option Explicit
    Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)
    '拷贝内存
    Private Declare Sub ZeroMemory Lib "kernel32.dll" Alias "RtlZeroMemory" (Destination As Any, ByVal Length As Long)
    '清空内存
    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 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 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 Declare Function KeyValArrayPtr Lib "MSVBVM60.DLL" Alias "VarPtr" (ptr() As Any) As Long
    Private Declare Function ShowWindow Lib "user32.dll" (ByVal hWnd As Long, ByVal nCmdShow As Long) As Long
    '显示/隐藏窗口
    Private Declare Function IsWindowVisible Lib "user32.dll" (ByVal hWnd As Long) As Long
    '判断指定窗口是否可见
    Private Type SAFEARRAY1D
            cDims               As Integer
            fFeatures           As Integer
            cbElements          As Long
            clocks              As Long
            pvData              As Long
            cElements           As Long
            lLbound             As Long
    End Type
    Private Const SW_SHOW = 5
    Private Const SW_HIDE = 0
    Private Const VK_F10 = &H79
    Private Const VK_F11 = &H7A
    Private Const FADF_AUTO = &H1
    Private Const WM_HOTKEY = &H312
    Private Const MOD_ALT = &H1
    Private Const MOD_CONTROL = &H2
    Private Const MOD_SHIFT = &H4
    Private Const GWL_WNDPROC = (-4)
    Private lpOldWndFunc As Long
    Private wKeyVal() As Integer
    Private dwKeyValue As Long
    Private lpSafeArray As SAFEARRAY1D
    '--------------------------------------------------------------------------------------
    '函 数 名: WindowProcedure
    '描    述: 窗口消息处理函数
    '--------------------------------------------------------------------------------------
    Private Function WindowProcedure(ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
            Select Case wMsg
                   Case WM_HOTKEY
                        dwKeyValue = lParam
                        Select Case wKeyVal(1)
                               Case VK_F10
                                    Call ShowWindow(hWnd, SW_SHOW)
                               Case VK_F11
                                    Call ShowWindow(hWnd, SW_HIDE)
                        End Select
                   Case Else
                        WindowProcedure = CallWindowProc(lpOldWndFunc, hWnd, wMsg, wParam, _
                        lParam)                                                             '原窗口消息处理
            End Select
    End Function
    '--------------------------------------------------------------------------------------
    '函 数 名: SubClass
    '描    述: 子类化窗口
    '--------------------------------------------------------------------------------------
    Public Sub SubClass(ByVal hWnd As Long)
           With lpSafeArray
                .cDims = 1
                .cElements = 2
                .fFeatures = FADF_AUTO
                .pvData = VarPtr(dwKeyValue)
           End With
           Call CopyMemory(ByVal KeyValArrayPtr(wKeyVal), VarPtr(lpSafeArray), 4)
           lpOldWndFunc = SetWindowLong(hWnd, GWL_WNDPROC, AddressOf WindowProcedure)       '新窗口消息处理
           Call RegisterHotKey(hWnd, 1000, 0, VK_F10)                                       '注册热键(F10)
           Call RegisterHotKey(hWnd, 1001, 0, VK_F11)                                       '注册热键(F11)
    End Sub
    '--------------------------------------------------------------------------------------
    '函 数 名: UnSubClass
    '描    述: 取消子类化
    '--------------------------------------------------------------------------------------
    Public Sub UnSubClass(ByVal hWnd As Long)
           Call UnregisterHotKey(hWnd, 1000)
           Call UnregisterHotKey(hWnd, 1001)
           Call ZeroMemory(ByVal KeyValArrayPtr(wKeyVal), 4)
           Call SetWindowLong(hWnd, GWL_WNDPROC, lpOldWndFunc)                              '恢复原窗口消息处理
    End Sub
    '窗口代码
    Option Explicit
    '--------------------------------------------------------------------------------------
    '事 件 名: Form_Load
    '描    述: ----
    '--------------------------------------------------------------------------------------
    Private Sub Form_Load()
            Call SubClass(Me.hWnd)                                                          '子类化窗口
    End Sub
    '--------------------------------------------------------------------------------------
    '事 件 名: Form_Unload
    '描    述: ----
    '--------------------------------------------------------------------------------------
    Private Sub Form_Unload(Cancel As Integer)
            Call UnSubClass(Me.hWnd)                                                        '取消子类化
    End Sub
    这是他给我的代码,呵呵,非常之好