怎样定义系统级的热键,也就是在程序失去焦点时也可以用。而且就要一个键比如F4,F8等。
请大家给个例子,谢谢。

解决方案 »

  1.   

    '=================窗体==========================
    Option ExplicitPrivate Sub Form_Load()
    Dim ret As Long'记录原来的window程序地址
    preWinProc = GetWindowLong(Me.hwnd, GWL_WNDPROC)
    '用自定义程序代替原来的window程序
    ret = SetWindowLong(Me.hwnd, GWL_WNDPROC, AddressOf Wndproc)idHotKey = 1'此处为定义需要的热键,比如Alt+Ctrl+1
    Modifiers = MOD_ALT + MOD_CONTROL 'Alt+Ctrl 键
    uVirtKey = vbKey1  '1键
    ret = RegisterHotKey(Me.hwnd, idHotKey, Modifiers, uVirtKey)End SubPrivate Sub Form_Unload(Cancel As Integer)
    Dim ret As Long
    '取消Message的截取,使之送往原来的windows程序
    ret = SetWindowLong(Me.hwnd, GWL_WNDPROC, preWinProc)
    Call UnregisterHotKey(Me.hwnd, uVirtKey)End Sub'========================模块=====================
    Option ExplicitDeclare Function SetWindowLong Lib "User32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
    Declare Function GetWindowLong Lib "User32" Alias "GetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long) As Long
    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
    Declare Function RegisterHotKey Lib "User32" (ByVal hwnd As Long, ByVal id As Long, ByVal fsModifiers As Long, ByVal vk As Long) As Long
    Declare Function UnregisterHotKey Lib "User32" (ByVal hwnd As Long, ByVal id As Long) As LongPublic Const WM_HOTKEY = &H312
    Public Const MOD_ALT = &H1
    Public Const MOD_CONTROL = &H2
    Public Const MOD_SHIFT = &H4
    Public Const GWL_WNDPROC = (-4)Public preWinProc As Long
    Public Modifiers As Long, uVirtKey As Long, idHotKey As LongPrivate Type taLong
        ll As Long
    End TypePrivate Type t2Int
        lWord As Integer
        hWord As Integer
    End TypePublic Function Wndproc(ByVal hwnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
        If Msg = WM_HOTKEY Then
            If wParam = idHotKey Then
                Dim lp As taLong, i2 As t2Int
                lp.ll = lParam
                LSet i2 = lp
                If (i2.lWord = Modifiers) And i2.hWord = uVirtKey Then
                    Shell "Notepad", vbNormalFocus
                    '此处为热键的调用部分,可自行修改,以实现任何热键功能
                End If
            End If
        End If
        '如果不是热键信息则调用原来的程序
        Wndproc = CallWindowProc(preWinProc, hwnd, Msg, wParam, lParam)
        
    End Function
      

  2.   

    Private Declare Function GetAsyncKeyState Lib "user32" (ByVal vkey As Long) As IntegerPrivate Function HotKey(vbKeyCode as integer) As Boolean
        HotKey=(GetAsyncKeyState(vbKeyCode) < 0)
    End FunctionPrivate Sub Timer1_Timer()
        If HotKey(vbKeyF4) Then
            ...
        End If
    End Sub
      

  3.   

    verywzm(寒江雪)讲的方法,我用过,可以
    但是,我想知道,如何定义对个热键????
      

  4.   

    verywzm(寒江雪)同志定义的函数(回调)里面wParam就是热键了吧。
    用idHotKey来定义,在定义的时候应该可以用“+”运算符来连接你的热键。推荐一个示例,其中是用HOOKKEY.DLL实现的,很简单的一个C编写的DLL,示例里面有一个LIST,显示了你所按下的键,当然包括组合键了,按照里面显示的数据来设置热键就可以了,并且可以进行相应处理。示例名字似乎叫“按键拦截程序”具体忘记了,这个示例我这里有,如果需要可以给你发过去。