在一个窗体上我想点一个按钮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焦点了,但是没有信息弹出,不知道如何是好啊
代码如下:
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焦点了,但是没有信息弹出,不知道如何是好啊
http://topic.csdn.net/t/20030508/02/1753386.html
可采用虚拟调用的方式: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
为什么我模拟点击这个窗体中按钮就不能执行按钮上我添加的弹出对话框的效果那?
你在DOWN和UP之间加一个延时试试。或者用按下空格或ENTER试试看能不能响应。
PostMessage提交的消息,不需要等返回就直接执行下一条代码
而SendMessage提交的消息,则需要等待返回才能执行下一条代码所以我估计你的代码有问题,你PostMessage第一条消息的时候,可能该消息还没执行你就发出第二条消息了~
所以处理顺序可能有点问题,你试用SendMessage看看~
如果不行的话就直接用BM_CLICK消息试试
'发送点击消息
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,指定句柄,及相对坐标就可以了.
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
从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
in moudle
'Click button
Public Const BM_CLICK = &HF5in sub
PostMessage Hnd_Wnd_xxxxx, BM_CLICK, 0, 0
那么调用时就应该这样写:
PostMessage Command5.hwnd, WM_LBUTTONDOWN, 0, ByVal 0&
PostMessage Command5.hwnd, WM_LBUTTONUP, 0, ByVal 0&
我已经测试过了!
。。,ByVal lParam 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 Long
这样就好了
PostMessage hwnd, &H201, &H1, 0
PostMessage hwnd, &H202, &O0, 0
这样肯定可以
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
只是当我把command5换成form1时就不行了.
why?
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