如何在你的程序没有焦点何还能收到鍵盘的响应:http://www.csdn.net/expert/topic/527/527919.xml

解决方案 »

  1.   

    Private Const MOD_ALT = &H1
    Private Const MOD_CONTROL = &H2
    Private Const MOD_SHIFT = &H4
    Private Const PM_REMOVE = &H1
    Private Const WM_HOTKEY = &H312
    Private Type POINTAPI
        x As Long
        y As Long
    End Type
    Private Type Msg
        hWnd As Long
        Message As Long
        wParam As Long
        lParam As Long
        time As Long
        pt As POINTAPI
    End Type
    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 PeekMessage Lib "user32" Alias "PeekMessageA" (lpMsg As Msg, ByVal hWnd As Long, ByVal wMsgFilterMin As Long, ByVal wMsgFilterMax As Long, ByVal wRemoveMsg As Long) As Long
    Private Declare Function WaitMessage Lib "user32" () As Long
    Private bCancel As Boolean
    Private Sub ProcessMessages()
        Dim Message As Msg
        'loop until bCancel is set to True
        Do While Not bCancel
            'wait for a message
            WaitMessage
            'check if it's a HOTKEY-message
            If PeekMessage(Message, Me.hWnd, WM_HOTKEY, WM_HOTKEY, PM_REMOVE) Then
                'minimize the form
                WindowState = vbMinimized
            End If
            'let the operating system process other events
            DoEvents
        Loop
    End Sub
    Private Sub Form_Load()
        'KPD-Team 2000
        'URL: http://www.allapi.net/
        'E-Mail: [email protected]
        Dim ret As Long
        bCancel = False
        'register the Ctrl-F hotkey
        ret = RegisterHotKey(Me.hWnd, &HBFFF&, MOD_CONTROL, vbKeyF)
        'show some information
        Me.AutoRedraw = True
        Me.Print "Press CTRL-F to minimize this form"
        'show the form and
        Show
        'process the Hotkey messages
        ProcessMessages
    End Sub
    Private Sub Form_Unload(Cancel As Integer)
        bCancel = True
        'unregister hotkey
        Call UnregisterHotKey(Me.hWnd, &HBFFF&)
    End Sub
      

  2.   

    PUBLIC CONST HOTKEY_ID = 1
    注册热键:
    RegisterHotKey Me.hwnd, HOTKEY_ID, 0(或者其他方式,看MSDN), vbKeyA
    SetNewWndProc frmMain.hwnd然后再用子类化:
    Public Sub SetNewWndProc(ByVal hwnd As Long)
    OldWindowProc = SetWindowLong(hwnd, GWL_WNDPROC, AddressOf WindowProc)
    End SubPublic Sub UnsetNewWndProc(ByVal hwnd As Long)
    SetWindowLong hwnd, GWL_WNDPROC, OldWindowProc
    End Sub
    '参数含义如下:
    'h---hWnd句柄    m---Msg消息号    w---wParam系统第1参数    l---lParam系统第2参数
    Public Function WindowProc(ByVal h As Long, ByVal m As Long, ByVal w As Long, ByVal l As Long) As Long
        Select Case m
            Case WM_HOTKEY:
                If w = HOTKEY_ID Then
    MsgBox "热键被按下! "
                 End If
        End Select
    WindowProc = CallWindowProc(OldWindowProc, h, m, w, l)
    End Function取消热键:
    UnregisterHotKey Me.hwnd, HOTKEY_ID
    UnsetNewWndProc Me.hwnd
    其他具体API和常数自己用APILoader声明就可以了。
      

  3.   

    Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long Private Sub Form_Load() 
    SendMessage Me.hwnd, &H32, vbKeyA, 0  'vbKeyA处可自行设置,如vbKeyB、vbKey8等 
    End Sub 
      

  4.   

    楼上代码还需要处理WM_SYSCOMMAND消息,否则只能把一个已经显示的窗口切换到前台。
      

  5.   


    private sub timer1_timer
    'getkeystate是API
     if GetKeyState(vbKeyA)<0 then msgbox "A is pressed!"end subtimer1.interval=1这样吧,不过不好,呵呵
      

  6.   

    to tg123
    函数PEEKMESSGAE里面的参数到底是什么意义,能不能在一个程序里同时定义两个以上的热键,帮忙写个程序好吗?比如一个是窗口最大化,一个是最小化,另一个是隐藏窗体。谢谢了。
      

  7.   

    回复人: Chice_wxg(我怕谁?我是谁!我是流氓我最贼。) (  ) 信誉:100  2002-2-19 8:11:40  得分:0  
      
    楼上代码还需要处理WM_SYSCOMMAND消息,否则只能把一个已经显示的窗口切换到前台。 
    当然。我的代码并不是启动热键。是呼出热键。