如下:向Word文档发送模拟按键A为什么不起作用?再就是如发送Alt+A如何作?
Private Sub Test()
    GHwnd = FindWindow("OpusApp", vbNullString)
    PostMessage GHwnd, WM_KEYDOWN, vbKeyA, 0
    PostMessage GHwnd, WM_KEYUP, vbKeyA, 0
End Sub

解决方案 »

  1.   

    也可用SendMessage,只要不需Work为焦点窗体即可
    使用keybd_event可以实现但要焦点才行
      

  2.   

    http://community.csdn.net/Expert/topic/2708/2708863.xml?temp=.3939936
      

  3.   

    //向Word文档发送模拟按键A为什么不起作用
    不起作用的原因是postmessage函数发送WM_KEYDOWN(WM_KEYUP)消息时,对应的lparam参数你设置为了0(而这个参数是比较复杂的,0-31位都有其具体的含义,具体的你自己看msdn),下面是一个简单的示例,作为例子,它向窗体上的textbox发送按键"a"(当然,修改之后用于你的程序是没有问题的)Option Explicit
    Private Const WM_KEYDOWN = &H100
    Private Const WM_KEYUP = &H101
    Private Declare Function OemKeyScan Lib "user32" (ByVal wOemChar As Long) As Long
    Private Declare Function PostMessage Lib "user32" Alias "PostMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As LongPrivate Sub Command1_Click()
        '测试
        PostMessage Text1.hwnd, WM_KEYDOWN, vbKeyA, ByVal GetLparam(vbKeyA, True)
        PostMessage Text1.hwnd, WM_KEYUP, vbKeyA, ByVal GetLparam(vbKeyA, False)
    End SubPrivate Function GetLparam(ByVal vKey As Long, ByVal flag As Boolean) As Long
        Dim ScanCode As String
        ScanCode = Hex(OemKeyScan(vKey) And &HFF)
        Select Case flag
        Case True
            GetLparam = CLng("&H00" + ScanCode + "0001") 'WM_KEYDOWN对应参数
        Case False
            GetLparam = CLng("&HC0" + ScanCode + "0001") 'WM_KEYUP对应参数
        End Select
    End Function
      

  4.   

    //BM_CLICK?好象没这个啊呵呵,BM_CLICK消息用于模拟点击按钮,对你没有帮助
      

  5.   

    对于你的问题,我个人觉得发送消息尽管可以实现,但还不如直接使word文档获得焦点,然后用sendkeys发送按键:
    Option Explicit
    Private Const SW_RESTORE = 9
    Private Declare Function PutFocus Lib "user32" Alias "SetFocus" (ByVal hwnd As Long) As Long '由于vb自带一个SetFocus函数,所以改个函数名
    Private Declare Function SetForegroundWindow Lib "user32" (ByVal hwnd As Long) As Long
    Private Declare Function ShowWindow Lib "user32" (ByVal hwnd As Long, ByVal nCmdShow As Long) As Long
    Private Sub Command1_Click()
        Dim mhwnd As Long
        mhwnd = &H190508 'word文档的句柄,你在实际编程中可以用findwindow获得
        SetForegroundWindow mhwnd
        ShowWindow mhwnd, SW_RESTORE
        SendKeys "a" '想发送alt+a的话,就写成SendKeys "%a"
    End Sub
    另外,需要说明的是调用word对象,实现起来也很容易
      

  6.   

    rainstormmaster(暴风雨 v2.0) 用你的例子代码修改如下运行后,Word文档未接收到任何信息,原因是??Private Sub Test()
        GHwnd = FindWindow("OpusApp", vbNullString)
        PostMessage GHwnd, WM_KEYDOWN, vbKeyA, ByVal GetLparam(vbKeyA, True)
        PostMessage GHwnd, WM_KEYUP, vbKeyA, ByVal GetLparam(vbKeyA, False)
    End SubPrivate Function GetLparam(ByVal vKey As Long, ByVal flag As Boolean) As Long
        Dim ScanCode As String
        ScanCode = Hex(OemKeyScan(vKey) And &HFF)
        Select Case flag
        Case True
            GetLparam = CLng("&H00" + ScanCode + "0001") 'WM_KEYDOWN对应参数
        Case False
            GetLparam = CLng("&HC0" + ScanCode + "0001") 'WM_KEYUP对应参数
        End Select
    End Function
      

  7.   

    //用你的例子代码修改如下运行后,Word文档未接收到任何信息,原因是??我这里没装word,没法具体测试,我估计应该是句柄的问题