要执行ctrl+F1操作
SendMessage NolHwnd, WM_KEYDOWN, vbKeyControl, 0
SendMessage NolHwnd, WM_KEYDOWN, vbKeyF1, 0
SendMessage NolHwnd, WM_KEYUP, vbKeyF1, 0
SendMessage NolHwnd, WM_KEYUP, vbKeyControl, 0
无效
PostMessage NolHwnd, WM_KEYDOWN, vbKeyControl, 0
PostMessage NolHwnd, WM_KEYDOWN, vbKeyF1, 0
PostMessage NolHwnd, WM_KEYUP, vbKeyF1, 0
PostMessage NolHwnd, WM_KEYUP, vbKeyControl, 0
执行结果为F1
求正解
SendMessage NolHwnd, WM_KEYDOWN, vbKeyControl, 0
SendMessage NolHwnd, WM_KEYDOWN, vbKeyF1, 0
SendMessage NolHwnd, WM_KEYUP, vbKeyF1, 0
SendMessage NolHwnd, WM_KEYUP, vbKeyControl, 0
无效
PostMessage NolHwnd, WM_KEYDOWN, vbKeyControl, 0
PostMessage NolHwnd, WM_KEYDOWN, vbKeyF1, 0
PostMessage NolHwnd, WM_KEYUP, vbKeyF1, 0
PostMessage NolHwnd, WM_KEYUP, vbKeyControl, 0
执行结果为F1
求正解
SENDMESSAGE是等待返回消息处理结果的,这样就把两个动作分开了,POST是把消息一放就返回,系统就当成^F1了。
它和後面是跟著{}if keycode='F' then
sendkeys{'F'}
end if
关于keybd_event和sendkeys请不要在这里讨论了
而不是自己根据WM_KeyDown、WM_KeyUp来记录Ctrl键状态
也就是说:
普通按键(如F1),可以用SendMessage发送WM_KeyDown、WM_KeyUp消息
状态按键(如Ctrl),只能用keybd_event修改
Option Explicit
Private Declare Function GetWindowThreadProcessId Lib "user32" (ByVal hwnd As Long, lpdwProcessId As Long) As Long
Private Declare Function SetFocusApi Lib "user32" Alias "SetFocus" (ByVal hwnd As Long) As Long
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 Declare Function AttachThreadInput Lib "user32" (ByVal idAttach As Long, ByVal idAttachTo As Long, ByVal fAttach As Long) As Long
Private Sub SendkeystoWindow(ByVal mhwnd As Long, ByVal str As String)
Dim Tid1 As Long, Tid2 As Long, pid As Long
Tid1 = GetWindowThreadProcessId(mhwnd, pid)
Tid2 = App.ThreadID
Call AttachThreadInput(Tid1, Tid2, True)
SetFocusApi mhwnd
SendKeys str
End Sub调用:
SendkeystoWindow NolHwnd, "^{f1}"