我想写个程序,驻留在内存里。然后,我按F10的功能就可以实再按下ALT+TAB的功能。

解决方案 »

  1.   

    模块代码
    Option ExplicitPrivate Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, _
        ByVal lpWindowName As String) As Long
    Private Declare Function FindWindowEx Lib "user32" Alias "FindWindowExA" (ByVal hWnd1 As Long, ByVal _
        hWnd2 As Long, ByVal lpsz1 As String, ByVal lpsz2 As String) As Long
    Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg _
        As Long, ByVal wParam As Long, ByVal lParam As Any) As Long
    Private Const WM_GETTEXT = &HD
    Private Const WM_GETTEXTLENGTH = &HE' Type Declarations
    Private Type KBDLLHOOKSTRUCT
     vkCode As Long
    End Type' Win32 API
    Private 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
      
    Private Declare Function UnhookWindowsHookEx Lib "user32" _
     (ByVal hHook As Long) As Long
     
    Private Declare Function CallNextHookEx Lib "user32" _
     (ByVal hHook As Long, _
      ByVal nCode As Long, _
      ByVal wParam As Long, _
      ByVal lParam As Long) As Long
      
    Private Declare Sub CopyMemory Lib "kernel32" _
     Alias "RtlMoveMemory" _
      (pDest As Any, _
       pSource As Any, _
       ByVal cbLength As Long)
     
    ' Constants
    Private Const WH_KEYBOARD_LL = 13&      ' Hook Flag
    Private Const HC_ACTION = 0&            ' Keyboard Process Message
     
    ' Variables
    Private m_hLLKeyboardHook As Long       ' The hook object
    Public g_bInterceptKeys As Boolean      ' Flag
    Dim hform As Long
    Dim hnextform As Long
    Dim hpass As Long
    Dim cLong As Long
    Dim astr As String * 256Public Function LowLevelKeyboardProc(ByVal nCode As Long, ByVal wParam As Long, _
                                         ByVal lParam As Long) As Long
     
     ' Set up the hook object
     Static tKeyboardHook As KBDLLHOOKSTRUCT
     If nCode = HC_ACTION Then
      Call CopyMemory(tKeyboardHook, ByVal lParam, Len(tKeyboardHook))  ' Display some info on the form
      
     If tKeyboardHook.vkCode = 121 Then
        SendKeys "%{TAB}", True '发送ALT+TAB
        Call UnSetSystemWideKeyboardHook
        Else
            Exit Function
        End If
        
     End If
      
      If g_bInterceptKeys Then
       ' Intercept the key and don't pass it along the hook chain
       LowLevelKeyboardProc = 1
       Exit Function
      End If
      
      ' If the message is not one we want to trap, pass it along
     ' through the hook chain to the intended app
     LowLevelKeyboardProc = CallNextHookEx(m_hLLKeyboardHook, nCode, wParam, lParam)End FunctionPublic Function SetSystemWideKeyboardHook() As Long ' Hook into the keyboard process
     
     ' Specifying 0 for the last parameter (dwThreadId) indicates a system wide
     ' hook
     
     If m_hLLKeyboardHook = 0 Then
      m_hLLKeyboardHook = SetWindowsHookEx(WH_KEYBOARD_LL, AddressOf LowLevelKeyboardProc, App.hInstance, 0&)
     End If If m_hLLKeyboardHook = 0 Then
      SetSystemWideKeyboardHook = 0
     Else
      SetSystemWideKeyboardHook = 1
     End IfEnd FunctionPublic Function UnSetSystemWideKeyboardHook() As Long ' Unhook from the keyboard process
     
     If m_hLLKeyboardHook <> 0 Then
      Call UnhookWindowsHookEx(m_hLLKeyboardHook)
      m_hLLKeyboardHook = 0
      UnSetSystemWideKeyboardHook = 1
     Else
      UnSetSystemWideKeyboardHook = 0
     End IfEnd Function
    窗体代码
    Option ExplicitPrivate Sub Form_Load()
        Form1.Visible = False
        Call SetSystemWideKeyboardHook
        
    End Sub
      

  2.   

    前段时间我还在新闻组和别人讨论利用系统级键盘钩子实现按键转换的问题。基本我现在的做法是将要转的按键拦截组,然后利用keybd_event,SendInput等发送另一个按键消息,就可以完成转换
      

  3.   

    代码基本和上面 programfish(努力成为程序员)提到的差不多,但是有差别
    差别在这里
    If (tKeyboardHook.vkCode = vbKeyA) And (wParam = 256) Then
        Call keybd_event(vbKeyB, 0, 0, 0)
        LowLevelKeyboardProc = 1
       Exit Function
    End If
    现在实现a到b的转化,你可以改成你要的,注意我加了wParam = 256这个条件,因为一次看见产生两个消息,如果不判断就发送两次新键
    将LowLevelKeyboardProc 返回非0值,按照msdn,它将拦截掉这个消息
      

  4.   

    发送ALT+TAB是显示当前运行的程序,我的机子上出现了和按ALT+TAB一样的效果,可能是你的机子速度比较快,所以一闪就过了,你可以把SendKeys "%{TAB}", True 换成其它的.
      

  5.   

    换成其它的我怎么能用ALT+TAB切焦点呀?