要执行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
求正解

解决方案 »

  1.   


    SENDMESSAGE是等待返回消息处理结果的,这样就把两个动作分开了,POST是把消息一放就返回,系统就当成^F1了。
      

  2.   

    我記得sendkeys沒有這樣用?
    它和後面是跟著{}if keycode='F' then
       sendkeys{'F'}
    end if 
      

  3.   

    SendMessage有先后次序的,直接用keybd_event API模拟好了
      

  4.   

    没有人熟悉SendMessage工作原理么
    关于keybd_event和sendkeys请不要在这里讨论了
      

  5.   

    用SendMessage是无法发送ctrl+F1因为程序在处理WM_KeyDown消息时是通过调用GetKeyState(或GetAsyncKeyState)直接得到Ctrl键状态的
    而不是自己根据WM_KeyDown、WM_KeyUp来记录Ctrl键状态
    也就是说:
    普通按键(如F1),可以用SendMessage发送WM_KeyDown、WM_KeyUp消息
    状态按键(如Ctrl),只能用keybd_event修改
      

  6.   

    用sendkeys就可以了:
    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}"