Private Declare Function GetAsyncKeyState Lib "user32" (ByVal vKey As Long) As IntegerPrivate Sub Timer1_Timer()
Dim C As Long  C = GetAsyncKeyState(112)'112是F1对应的码
  if C<>0 then  msgbox "F1被按下了"End Sub

解决方案 »

  1.   

    Private Declare Function GetAsyncKeyState Lib "user32" (ByVal vKey As Long) As Integer用这个函数就可以实现了
      

  2.   

    多给我分哦,我刚到,缺分。你的问题可以这样实现:(有的变量需要自己定义哦,API函数和常量可以参考VS6里的API VIEW)
    1、模块定义
    Public Declare Function SetWindowPos Lib "user32" (ByVal hwnd As Long, ByVal hWndInsertAfter As Long, ByVal X As Long, ByVal Y As Long, ByVal cx As Long, ByVal cy As Long, ByVal wFlags As Long) As LongPublic Const SWP_NOSIZE = &H1
    Public Const SWP_NOACTIVATE = &H10Public Const HWND_BOTTOM = 1
    Public Const HWND_TOPMOST = -1
    Public Const HWND_NOTOPMOST = -2
    Public Const HWND_TOP = 0
    Public Const SWP_SHOWWINDOW = &H40
    Public Const SWP_NOMOVE = &H2Private Type taLong
    ll As Long
    End TypePrivate Type t2Int
    lWord As Integer
    hword As Integer
    End Typepublic ShowFormTop as Boolean  'Form显示置前置后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  ' 如果消息是定义的热键,则处理自己的代码,显示窗口
       ShowFormTop = Not ShowFormTop 
       If ShowFormTop Then
          Call SetWindowPos(frmMain.hwnd, HWND_TOP, 0, 0, 0, 0, SWP_NOSIZE + SWP_NOMOVE)   ' 窗口置前
         Else
          Call SetWindowPos(frmMain.hwnd, HWND_BOTTOM, 0, 0, 0, 0, SWP_NOSIZE + SWP_NOMOVE)   ' 窗口置后
       End If
    End If
    End If
    End If
    '将之送往原来的Window Procedure
    WndProc = CallWindowProc(preWinProc, hwnd, Msg, wParam, lParam)
    End Function2、Form中语句
    Sub Form_Load()
       preWinProc = GetWindowLong(Me.hwnd, GWL_WNDPROC)
       ret = SetWindowLong(Me.hwnd, GWL_WNDPROC, AddressOf WndProc)
       idHotKey = 1
       ret = RegisterHotKey(hwnd, idHotKey, Modifiers, uVirtKey)  '注册系统热键,idHotkey=1, Modifiers=1,2,4,8 分别对应Ctrl,Alt,shift,Windows键,可以组合,uVirtKey=vbKeyQ 键Q 
    End sub
      

  3.   

    to  TechnoFantasy(www.applevb.com) :
    为什么非要设置进程的热键呢?向那样设置窗口的热键不一样的吗?因为,我的vb程序可能有几十个模式和非模式的窗口,如果设置窗口的热键的话,我就必须在每一个窗口代码中写一句RegisterHotKey的调用,比较麻烦。所以我想做成系统热键使得制定程序重新获得焦点。to cooldai(酷呆)
    谢谢!
    是不是每个窗口的orm_load都要有如下代码:
    Sub Form_Load()
       preWinProc = GetWindowLong(Me.hwnd, GWL_WNDPROC)
       ret = SetWindowLong(Me.hwnd, GWL_WNDPROC, AddressOf WndProc)
       idHotKey = 1
       ret = RegisterHotKey(hwnd, idHotKey, Modifiers, uVirtKey)  '注册系统热键,idHotkey=1, Modifiers=1,2,4,8 分别对应Ctrl,Alt,shift,Windows键,可以组合,uVirtKey=vbKeyQ 键Q 
    End sub
      

  4.   

    热键注册只需要一次。如果你要控制多个窗口置前、置后的话,请在下面这段代码里控制。If (i2.lWord = Modifiers) And i2.hword = uVirtKey Then  ' 如果消息是定义的热键,则处理自己的代码,显示窗口
       ShowFormTop = Not ShowFormTop 
       If ShowFormTop Then
          Call SetWindowPos(frmMain.hwnd, HWND_TOP, 0, 0, 0, 0, SWP_NOSIZE + SWP_NOMOVE)   ' 窗口置前
         Else
          Call SetWindowPos(frmMain.hwnd, HWND_BOTTOM, 0, 0, 0, 0, SWP_NOSIZE + SWP_NOMOVE)   ' 窗口置后
       End If
      

  5.   

    谢谢各位!
    另一个问题:
    请问,如何获得已知进程PID的当前窗口的句柄hWnd,请问如何实现?