RT
要做个后台的FORM
在什么事件下使用?
如何使用?
需要不需要别的控件?

解决方案 »

  1.   

    http://www.allapi.net/apilist/GetKeyState.shtml
      

  2.   

    'In a module
    Public Const WH_KEYBOARD = 2
    Public Const VK_SHIFT = &H10
    Declare Function CallNextHookEx Lib "user32" (ByVal hHook As Long, ByVal ncode As Long, ByVal wParam As Long, lParam As Any) As Long
    Declare Function GetKeyState Lib "user32" (ByVal nVirtKey As Long) As Integer
    Declare Function SetWindowsHookEx Lib "user32" Alias "SetWindowsHookExA" (ByVal idHook As Long, ByVal lpfn As Long, ByVal hmod As Long, ByVal dwThreadId As Long) As Long
    Declare Function UnhookWindowsHookEx Lib "user32" (ByVal hHook As Long) As Long
    Public hHook As Long
    Public Function KeyboardProc(ByVal idHook As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
        'if idHook is less than zero, no further processing is required
        If idHook < 0 Then
            'call the next hook
            KeyboardProc = CallNextHookEx(hHook, idHook, wParam, ByVal lParam)
        Else
            'check if SHIFT-S is pressed
            If (GetKeyState(VK_SHIFT) And &HF0000000) And wParam = Asc("S") Then
                'show the result
                Form1.Print "Shift-S pressed ..."
            End If
            'call the next hook
            KeyboardProc = CallNextHookEx(hHook, idHook, wParam, ByVal lParam)
        End If
    End Function'In a form, called Form1
    Private Sub Form_Load()
        'KPD-Team 2000
        'URL: http://www.allapi.net/
        'E-Mail: [email protected]
        'set a keyboard hook
        hHook = SetWindowsHookEx(WH_KEYBOARD, AddressOf KeyboardProc, App.hInstance, App.ThreadID)
    End Sub
    Private Sub Form_Unload(Cancel As Integer)
        'remove the windows-hook
        UnhookWindowsHookEx hHook
    End Sub
      

  3.   

    If GetAsyncKeyState(vbKeyF9) <> 0 And GetAsyncKeyState(vbKeyControl) Then检查是否按了CTRL+F9
      

  4.   


    Private Declare Sub mouse_event Lib "user32" (ByVal dwFlags As Long, ByVal dx As Long, ByVal dy As Long, ByVal cButtons As Long, ByVal dwExtraInfo As Long)
    Const MOUSEEVENTF_LEFTDOWN = &H2
    Const MOUSEEVENTF_LEFTUP = &H4
    Const MOUSEEVENTF_MIDDLEDOWN = &H20
    Const MOUSEEVENTF_MIDDLEUP = &H40
    Const MOUSEEVENTF_MOVE = &H1
    Const MOUSEEVENTF_ABSOLUTE = &H8000
    Const MOUSEEVENTF_RIGHTDOWN = &H8
    Const MOUSEEVENTF_RIGHTUP = &H10
    Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)
        Select Case KeyCode
            Case vbKeyF10
                Do
                    mouse_event MOUSEEVENTF_LEFTDOWN Or MOUSEEVENTF_LEFTUP, 0&, 0&, cButt, dwEI
                    DoEvents
                    
                Loop
            Case vbKeyF11
                Do
                    mouse_event MOUSEEVENTF_RIGHTDOWN Or MOUSEEVENTF_RIGHTUP, 0&, 0&, cButt, dwEI
                    DoEvents
                Loop
            Case vbKeyF12
                Exit Sub
        End Select
    End Sub那这段代码如何用GetKeyState修改?
      

  5.   

    GetKeyState是判断某一按键是否按下
    要使用热键的话
    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 fsModifiers As Long, ByVal vk As Long) As Long
    Private Declare Function UnregisterHotKey Lib "user32" (ByVal hWnd As Long, ByVal id As Long) As LongPrivate 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 preWinProc As Long
    Private 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 Type
    Dim SH As BooleanPrivate Function Wndproc(ByVal hWnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
        If Msg = WM_HOTKEY And Form1.Visible = False 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
                    SH = Not (SH)
                    If SH Then
                        Shell_NotifyIcon NIM_DELETE, nfIconData
                    Else
                        Shell_NotifyIcon NIM_ADD, nfIconData
                    End If
                End If
            End If
        End If
        '如果不是热键信息则调用原来的程序
        Wndproc = CallWindowProc(preWinProc, hWnd, Msg, wParam, lParam)End FunctionPublic Sub LoadHotKey(Frm As Form)
    Dim ret As Long'记录原来的window程序地址
    preWinProc = GetWindowLong(Frm.hWnd, GWL_WNDPROC)
    '用自定义程序代替原来的window程序
    ret = SetWindowLong(Frm.hWnd, GWL_WNDPROC, AddressOf Wndproc)idHotKey = 1
    Modifiers = MOD_ALT '+ MOD_CONTROL Alt+Ctrl 键在这里修改你自己需要的热键
    uVirtKey = vbKeyZ
    ret = RegisterHotKey(Frm.hWnd, idHotKey, Modifiers, uVirtKey)
    End SubPublic Sub UnHotkey(Frm As Form)
    Dim ret As Long
    '取消Message的截取,使之送往原来的windows程序
    ret = SetWindowLong(Frm.hWnd, GWL_WNDPROC, preWinProc)
    Call UnregisterHotKey(Frm.hWnd, uVirtKey)
    End Sub使用LoadHotKey me 卸载UnHotkey me