有没有VB高手,来帮我用API写个热键响应程序,或指出写这段程序需要的API函数!
要求: 
 我现在手头有一个比较大的循环,在程序执行的时候,我希望能控制它,当我按下某个键的时候,能终止这个程序的执行!其目的是,万一碰到死循环,我也可以结束它!

解决方案 »

  1.   

    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 Type
    Private Type t2Int
       lWord As Integer
       hword As Integer
    End Type
     Public 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
              Debug.Print "HotKey Shift-Alt-G Pressed "
              Shell "notepad", vbNormalFocus
           End If
       End If
     End If
     '将之送往原来的Window Procedure
     wndproc = CallWindowProc(preWinProc, hwnd, Msg, wParam, lParam)
     End Function
     
    '以下在 Form
    Sub Form_Load()
     Dim ret As Long
     preWinProc = GetWindowLong(Me.hwnd, GWL_WNDPROC)
     ret = SetWindowLong(Me.hwnd, GWL_WNDPROC, AddressOf wndproc)
     idHotKey = 1 'in the range &h0000 through &hBFFF
     Modifiers = MOD_ALT + MOD_SHIFT
     uVirtKey = vbKeyG
     ret = RegisterHotKey(Me.hwnd, idHotKey, Modifiers, uVirtKey)
     End Sub Private Sub Form_Unload(Cancel As Integer)
     Dim ret As Long
     '取消Message的截取,而使之又只送往原来的Window Procedure
     ret = SetWindowLong(Me.hwnd, GWL_WNDPROC, preWinProc)
     Call UnregisterHotKey(Me.hwnd, uVirtKey)
     End Sub
      

  2.   

    谢谢leesheng(小胜),我来研究一下,希望你能再次得到你的指点!