在一个窗体上我想点一个按钮Command2执行PostMessage模拟点击这个窗体中另外一个按钮Command5
代码如下:
Public Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
Public Declare Function PostMessage Lib "user32" Alias "PostMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
Public Const WM_LBUTTONDOWN = &H201
Public Const WM_LBUTTONUP = &H202
Private Sub Command2_Click()
       PostMessage Command5.hwnd, WM_LBUTTONDOWN, 0, 0
       PostMessage Command5.hwnd, WM_LBUTTONUP, 0, 0
End Sub
Private Sub Command5_Click()
   MsgBox "command5"
End Sub
都已经能获得Command5焦点了,但是没有信息弹出,不知道如何是好啊

解决方案 »

  1.   

    postmessage模拟鼠标,参见:
    http://topic.csdn.net/t/20030508/02/1753386.html
      

  2.   

    难道csdn上的高手们总是喜欢答非所问吗?
      

  3.   

    确实是答非所问。但我个人认为,在一个按钮中单击另外一个按钮,用不着想那么复杂吧。
    可采用虚拟调用的方式:Private Sub Command2_Click()        
            call Command5_Click
    End Sub 
    Private Sub Command5_Click() 
       MsgBox "command5" 
    End Sub 只是有一点注意:如果Command5在其他窗体上,比如Form2上,就要采取以下办法才行:Private Sub Command2_Click()        
            call Form2.Command5_Click
    End Sub Public Sub Command5_Click() 
       MsgBox "command5" 
    End Sub 
      

  4.   

    我当然知道你这个方法了,我只是想这样试验一下PostMessage效果,我最终目的是想点击另外一个应用程序的按钮,结果我发现连本窗口中的按钮都不能执行。不知道你明白我的意思吗?
      

  5.   

    你给我的网址并不是用PostMessage的阿,我要模拟鼠标单击
      

  6.   

    你试一下,用SendMessage行不行? 
      

  7.   

    我用postmessage模拟点击这个窗体中另外一个文本框,我把文本框加了click事件弹出一个对话框,能够看到效果。
    为什么我模拟点击这个窗体中按钮就不能执行按钮上我添加的弹出对话框的效果那?
      

  8.   

    按钮的事件触发,可不只是鼠标按下,而是按下并放开,虽然都叫Click。
      

  9.   

    看错了。
    你在DOWN和UP之间加一个延时试试。或者用按下空格或ENTER试试看能不能响应。
      

  10.   

    根据我自己的理解
    PostMessage提交的消息,不需要等返回就直接执行下一条代码
    而SendMessage提交的消息,则需要等待返回才能执行下一条代码所以我估计你的代码有问题,你PostMessage第一条消息的时候,可能该消息还没执行你就发出第二条消息了~
    所以处理顺序可能有点问题,你试用SendMessage看看~
    如果不行的话就直接用BM_CLICK消息试试
      

  11.   

    使用PostMessage. Private Function SendClick(hwnd As Long, mX As Long, mY As Long) 
         '发送点击消息 
        Dim I As Long 
         
        I = PostMessage(hwnd, WM_LBUTTONDOWN, 0, (mX And &HFFFF) + (mY And &HFFFF) * &H10000) 
        I = PostMessage(hwnd, WM_LBUTTONUP, 0, (mX And &HFFFF) + (mY And &HFFFF) * &H10000) 
    End Function 调用SendClick,指定句柄,及相对坐标就可以了.
      

  12.   


    Private Declare Function PostMessage Lib "user32.dll" Alias "PostMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
    Private Const WM_LBUTTONDOWN As Long = &H201
    Private Const WM_LBUTTONUP As Long = &H202Private Sub Command1_Click()
        SendClick Me.hwnd, 1, 1
    End SubPrivate Sub Form_Click()
        MsgBox "dasd"
    End SubPrivate Function SendClick(hwnd As Long, mX As Long, mY As Long)
        '发送点击消息
        Dim I As Long
         
        I = PostMessage(hwnd, WM_LBUTTONDOWN, 0, (mX And &HFFFF) + (mY And &HFFFF) * &H10000)
        I = PostMessage(hwnd, WM_LBUTTONUP, 0, (mX And &HFFFF) + (mY And &HFFFF) * &H10000)
    End Function
      

  13.   

    楼主的POSTMESSAGE声明有问题哦,
    从API阅览器提出来的是
    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 Long
      

  14.   

    用这个简单
    in moudle
    'Click button
    Public Const BM_CLICK = &HF5in sub
    PostMessage Hnd_Wnd_xxxxx, BM_CLICK, 0, 0
      

  15.   

    一定要用PostMessage吗? 其实Mouse_event就可以了
      

  16.   

    你的声明中第二个参数"lParam" 用了 "As Any",
    那么调用时就应该这样写:
    PostMessage Command5.hwnd, WM_LBUTTONDOWN, 0, ByVal 0&
    PostMessage Command5.hwnd, WM_LBUTTONUP, 0, ByVal 0&
    我已经测试过了!
      

  17.   

    否则就用[panko]贴出来的格式声明:
    。。,ByVal lParam As Long) As Long
      

  18.   

    为什么不直接调用Command5的CLick事件?
      

  19.   

    我感觉各位提出的其他途径都不符合楼主发帖的本意.楼主的问题就在对API声明中"Any"的理解不透上。
      

  20.   

    楼住应该发送BM_CLICK消息给按钮
      

  21.   

    问题是出现在函数声明的最那那个参数类型,
    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 Long
    这样就好了
      

  22.   

    PostMessage hwnd, &H200, &O0, 0
    PostMessage hwnd, &H201, &H1, 0
    PostMessage hwnd, &H202, &O0, 0
    这样肯定可以
      

  23.   

    Option Explicit
    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 PostMessage Lib "user32" Alias "PostMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
    Private Const WM_LBUTTONDOWN = &H201
    Private Const WM_LBUTTONUP = &H202
    Private Sub Command2_Click()
          PostMessage Command5.hwnd, WM_LBUTTONDOWN, 0&, ByVal 0&
          PostMessage Command5.hwnd, WM_LBUTTONUP, 0&, ByVal 0&
    End Sub
    Private Sub Command5_Click()
      MsgBox "command5"
    End Sub
      

  24.   

    楼上的代码果然好使用.
    只是当我把command5换成form1时就不行了.
    why?
      

  25.   

    Private Declare Function SetCursorPos Lib "user32" (ByVal X As Long, ByVal Y As Long) As Long 
    Private Declare Sub mouse_event Lib "user32" (ByVal dwFlags As Long, ByVal dx As Long, ByVal dy As Long, ByVal cButtons As Long, ByVal dwExtraInfo As Long) 
    Private Sub Command1_Click() 
    Dim posx, posy 
    posx = 100: posy = 100 
    a = SetCursorPos(posx, posy) 
    mouse_event MOUSEEVENTF_ABSOLUTE Or MOUSEEVENTF_LEFTDOWN, posx, posy, 0, 0 
    mouse_event MOUSEEVENTF_ABSOLUTE Or MOUSEEVENTF_LEFTUP, posx, posy, 0, 0