我想做一个visible=false的form,如何让我一按下键盘上某个键(比如s)就执行visible=true命令(即不借助其他form唤醒该程序)?用不用getkeystate都行,代码要简洁一点,最好说一下用法
还有如何用getkeystate检测是否同时按下两个键?

解决方案 »

  1.   


    Private Declare Function GetKeyState Lib "User32" (ByVal nVirtKey As Long) As Integer 
        ' Virtual key values 
        Const VK_TAB = &H9 
        Const VK_SHIFT = &H10 
         
        Sub txtAreaCode_LostFocus() 
        Dim iRetVal As Integer 
         
         ' Check for a tab out of this control 
         ' Skip the state field 
         iRetVal = GetKeyState(VK_SHIFT) 
         ' 如果没有按shift,检查tab 
         If iRetVal <> -128 And iRetVal <> -127 Then 
         iRetVal = GetKeyState(VK_TAB) 
         If iRetVal = -128 Or iRetVal = -127 Then ' tab键按下 
         txtPhone.SetFocus 
         End If 
         End If 
        End Sub 
    Private Const VK_Ctrl = (键盘虚拟码)
    Private Const VK_C = (键盘虚拟码)
    keybd_event VK_Ctrl, 0, 0, 0 '(虚拟键位按下)
    Sleep 300
    keybd_event VK_C, 0, 0, 0 '(虚拟键位按下)
    Sleep 300
    keybd_event VK_C, 0, &H2, 0(虚拟按键 弹起)
    Sleep 100
    keybd_event VK_Ctrl, 0, &H2, 0 (虚拟按键 弹起)延时是必须的 没有延时将达不到效果 但是时间可以短些,windows 处理消息不是即使的写程序用给出相当的延时 有益于程序的稳定……sleep的API 声明:Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As LongVB 屏蔽键盘(包含组合键)
    2008-12-14 21:39
    Option Explicit
    Public 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
    Public Declare Function UnhookWindowsHookEx Lib "user32" (ByVal hHook As Long) As Long
    Public Declare Function CallNextHookEx Lib "user32" (ByVal hHook As Long, ByVal nCode As Long, ByVal wParam As Long, lParam As Any) As Long
    Public Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (lpvDest As Any, ByVal lpvSource As Long, ByVal cbCopy As Long)
    Public Type KEYMSGS
           vKey As Long
           sKey As Long
           flag As Long
           time As Long
    End Type
    Public Const TH32CS_SNAPPROCESS = &H2&
    Public Const SPI_SCREENSAVERRUNNING = 97
    Public Const WH_KEYBOARD_LL = 13
    Public Const VK_LWIN = &H5B
    Public Const VK_RWIN = &H5C
    Public Const HC_ACTION = 0
    Public Const HC_SYSMODALOFF = 5
    Public Const HC_SYSMODALON = 4
    Public Const WM_KEYDOWN = &H100
    Public Const WM_KEYUP = &H101
    Public Const WM_SYSKEYDOWN = &H104
    Public Const WM_SYSKEYUP = &H105
    Public Const VK_BACK = &H8
    Public Const VK_TAB = &H9
    Public Const VK_ESCAPE = &H1B
    Public Const VK_F5 = &H74
    Public Const VK_CONTROL = &H11
    Dim FileNumber As Integer
    Public P As KEYMSGS
    Public lHook As Long
    Public Declare Function GetAsyncKeyState Lib "user32" (ByVal vKey As Long) As Integer
    Public Const VK_ATTN = &HF6
    Public Function LowLevelKeyboardProc(ByVal nCode As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
        Dim fEatKeystroke As Boolean
        If (nCode = HC_ACTION) Then
            If wParam = WM_KEYDOWN Or wParam = WM_SYSKEYDOWN Or wParam = WM_KEYUP Or wParam = WM_SYSKEYUP Then
                CopyMemory P, ByVal lParam, Len(P)
                Select Case P.vKey
                    Case VK_LWIN, VK_RWIN           '如果按了WIN键
                        fEatKeystroke = True        '就吃了
                    Case VK_ESCAPE                  'esc
                        fEatKeystroke = True
                    Case VK_F5                      'f5
                        fEatKeystroke = True
                    Case 115                        'F4
                        fEatKeystroke = True
                    Case 164, 165                   'alt
                        fEatKeystroke = True
                End Select
                Debug.Print P.vKey
                If P.vKey = 160 And GetAsyncKeyState(VK_CONTROL) Then fEatKeystroke = True 'ctrl+shift
                If P.vKey = 161 And GetAsyncKeyState(VK_CONTROL) Then fEatKeystroke = True 'ctrl+shift
                If P.vKey = 32 And GetAsyncKeyState(VK_CONTROL) Then fEatKeystroke = True 'ctrl+空格
                If P.vKey = 78 And GetAsyncKeyState(VK_CONTROL) Then fEatKeystroke = True   'ctrl+n
                If P.vKey = 82 And GetAsyncKeyState(VK_CONTROL) Then fEatKeystroke = True   'ctrl+ r
                If P.vKey = 81 And GetAsyncKeyState(VK_CONTROL) Then fEatKeystroke = True   'ctrl+ q
                If P.vKey = 87 And GetAsyncKeyState(VK_CONTROL) Then fEatKeystroke = True   'ctrl+ w
                If P.vKey = 69 And GetAsyncKeyState(VK_CONTROL) Then fEatKeystroke = True   'ctrl+e
                If P.vKey = 73 And GetAsyncKeyState(VK_CONTROL) Then fEatKeystroke = True   'ctrl+i
                If P.vKey = 79 And GetAsyncKeyState(VK_CONTROL) Then fEatKeystroke = True   'ctrl+o
                If P.vKey = 80 And GetAsyncKeyState(VK_CONTROL) Then fEatKeystroke = True 'ctrl+p
                If P.vKey = 68 And GetAsyncKeyState(VK_CONTROL) Then fEatKeystroke = True 'ctrl+d
                If P.vKey = 70 And GetAsyncKeyState(VK_CONTROL) Then fEatKeystroke = True 'ctrl+f
                If P.vKey = 72 And GetAsyncKeyState(VK_CONTROL) Then fEatKeystroke = True 'ctrl+h
                If P.vKey = 76 And GetAsyncKeyState(VK_CONTROL) Then fEatKeystroke = True 'ctrl+l
                If P.vKey = 78 And GetAsyncKeyState(VK_CONTROL) Then fEatKeystroke = True 'ctrl+n
                If P.vKey = 66 And GetAsyncKeyState(VK_CONTROL) Then fEatKeystroke = True 'ctrl+b
                If P.vKey = 37 And GetAsyncKeyState(VK_ATTN) Then fEatKeystroke = True 'ALT+<
                If P.vKey = 39 And GetAsyncKeyState(VK_ATTN) Then fEatKeystroke = True 'ALT+<
            End If
        End If
        If fEatKeystroke Then
            LowLevelKeyboardProc = -1
        Else
            LowLevelKeyboardProc = CallNextHookEx(0, nCode, wParam, ByVal lParam)
        End If
    End Function
    Public Function HOOK() As Boolean
        On Error GoTo errh
        lHook = SetWindowsHookEx(WH_KEYBOARD_LL, AddressOf LowLevelKeyboardProc, App.hInstance, 0)
        HOOK = True
        Exit Function
    errh:
        HOOK = False
    End Function
    Public Sub UNHOOK()
        UnhookWindowsHookEx lHook
    End Sub 
      

  2.   

    在form中加个Timer控件,周期设置成30到50。
    然后Timer控件在事件过程中检查需要监视的按键是否按下就行了。
      

  3.   

    这段代码就可以实现通过按S键,使窗口进行 显示/隐藏 的切换:Option ExplicitPrivate Declare Function GetKeyState Lib "user32" (ByVal nVirtKey As Long) As IntegerDim lFlag&, lWinSta&Private Sub Form_Load()
       lFlag = 0
       lWinSta = -1
       Timer1.Interval = 50
       Timer1.Enabled = True
    End SubPrivate Sub Timer1_Timer()
       If (lFlag = 0) Then
          If (GetKeyState(vbKeyS) And &H8000&) Then
             lFlag = 1
             lWinSta = Not lWinSta
             Me.Visible = lWinSta
          End If
       Else
          lFlag = GetKeyState(vbKeyS) And &H8000&
       End If
    End Sub
      

  4.   


    'Example Name: Activating CapsLock and NumLock on Win9x '------------------------------------------------------------------------------
    '
    ' BAS Moduel Code
    '
    '------------------------------------------------------------------------------
    Option ExplicitPublic Const VK_CAPITAL = &H14Public Type KeyboardBytes
       kbByte(0 To 255) As Byte
    End TypePublic kbArray As KeyboardBytesPublic Declare Function GetKeyState Lib "user32" _
       (ByVal nVirtKey As Long) As LongPublic Declare Function GetKeyboardState Lib "user32" _
       (kbArray As KeyboardBytes) As LongPublic Declare Function SetKeyboardState Lib "user32" _
       (kbArray As KeyboardBytes) As Long
    '--end block--'
    '------------------------------------------------------------------------------
    '
    ' Form Code
    '
    '------------------------------------------------------------------------------
    Option ExplicitPrivate Sub Form_Load()   Label1.Caption = IIf(CapsLock() = 1, "On", "Off")End Sub
    Function CapsLock() As Boolean
        
       CapsLock = GetKeyState(VK_CAPITAL) And 1 = 1
        
    End Function
    Private Sub Command1_Click()    GetKeyboardState kbArray
        kbArray.kbByte(VK_CAPITAL) = IIf(kbArray.kbByte(VK_CAPITAL) = 1, 0, 1)
        SetKeyboardState kbArray    Label1.Caption = IIf(CapsLock() = 1, "On", "Off")End Sub
    Private Sub Command2_Click()    GetKeyboardState kbArray
        kbArray.kbByte(VK_CAPITAL) = 1
        SetKeyboardState kbArray    Label1.Caption = IIf(CapsLock() = 1, "On", "Off")End Sub
    Private Sub Command3_Click()    GetKeyboardState kbArray
        kbArray.kbByte(VK_CAPITAL) = 0
        SetKeyboardState kbArray    Label1.Caption = IIf(CapsLock() = 1, "On", "Off")End Sub
      

  5.   

    定义lFlag&, lWinSta&这两个变量是什么意思?
      

  6.   

    变量 lFlag 是‘逻辑锁’,这个是必要的。
    否则你按下S键时,窗口就已经 显示/隐藏 很多次了。
    有这个,就能保证你按下时,只切换一次状态;你必须放开后再按下,才能再次切换状态。变量 lWinSta 是标识窗口显示状态的。
    可以不用,改成这样就行了:
    Me.Visible = Not Me.Visible
    用变量来标识,是为了减少‘访问对象’的次数。
      

  7.   

    我研究了一下三楼的代码,问一下代码后面的&H8000&是什么意思?本人小白