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
Dim C As Long C = GetAsyncKeyState(112)'112是F1对应的码
if C<>0 then msgbox "F1被按下了"End Sub
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
为什么非要设置进程的热键呢?向那样设置窗口的热键不一样的吗?因为,我的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
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
另一个问题:
请问,如何获得已知进程PID的当前窗口的句柄hWnd,请问如何实现?