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
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声明就可以了。
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
楼上代码还需要处理WM_SYSCOMMAND消息,否则只能把一个已经显示的窗口切换到前台。
private sub timer1_timer 'getkeystate是API if GetKeyState(vbKeyA)<0 then msgbox "A is pressed!"end subtimer1.interval=1这样吧,不过不好,呵呵
to tg123 函数PEEKMESSGAE里面的参数到底是什么意义,能不能在一个程序里同时定义两个以上的热键,帮忙写个程序好吗?比如一个是窗口最大化,一个是最小化,另一个是隐藏窗体。谢谢了。
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
注册热键:
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声明就可以了。
SendMessage Me.hwnd, &H32, vbKeyA, 0 'vbKeyA处可自行设置,如vbKeyB、vbKey8等
End Sub
private sub timer1_timer
'getkeystate是API
if GetKeyState(vbKeyA)<0 then msgbox "A is pressed!"end subtimer1.interval=1这样吧,不过不好,呵呵
函数PEEKMESSGAE里面的参数到底是什么意义,能不能在一个程序里同时定义两个以上的热键,帮忙写个程序好吗?比如一个是窗口最大化,一个是最小化,另一个是隐藏窗体。谢谢了。
楼上代码还需要处理WM_SYSCOMMAND消息,否则只能把一个已经显示的窗口切换到前台。
当然。我的代码并不是启动热键。是呼出热键。