为什么PostMessage要按两次才能实现点击button事件?

lwy7758 2011-05-10 06:18:46
两个form, formSet和formGet

formSet上buttonSet的事件是查找formGet上的button, 然后用postmessage发送点击消息.


'buttonSet
Hwd = FindWindow(vbNullString, "FormGet")
HwdButton = wdButton = FindWindowEx(Hwd, 0, vbNullString, "Command1")
PostMessage HwdButton, BM_CLICK, 0, 0


但是为什么要点击两次buttonSet, formGet才会相应button被点击的事件呢?

然后我如果把formGet窗体最小化,就可以每次都成功. 好像是跟焦点有关. 但我试着先改变焦点然后再发送点击消息,好像也不行:

Me.SetFocus
Command1.SetFocus
PostMessage HwdButton, BM_CLICK, 0, 0
...全文
432 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
lwy7758 2011-05-12
  • 打赏
  • 举报
回复
没人帮忙看吗?
lwy7758 2011-05-11
  • 打赏
  • 举报
回复
哦 我发现如果有对话框弹出来的话,就可能导致下次PostMessage/SendMessage失效. 可能还是跟焦点有关..
lwy7758 2011-05-11
  • 打赏
  • 举报
回复
To dbcontrols,
句柄是绝对拿到了的, 而且用SpyLite验证是对的.
然后我用你上面的代码去实验计算器, 发现也成功了, 可以连续sendmessage不失效. 但我又用我的app来实验,发现还是不行. 能帮忙看下吗? 我把我的代码上传到这里了. 里面有两个自己写的实验用的app以及代码(绝对不是病毒哈).
http://u.115.com/file/clify17z

先打开Calculate2.exe和Get2.exe, 然后点击Get2.exe里面的button,会调用Calculate2里面的那个button.
Calculate2里面的那个button的作用是计算两个文本框之和.然后弹出值来.
如果弹出来后,你点OK button,再点击Get2.exe里面的button,就会失效一次, 然后再点击才能又调用成功.
dbcontrols 2011-05-10
  • 打赏
  • 举报
回复
Private Const WM_LBUTTONDOWN = &H201
Private Const WM_LBUTTONUP = &H202
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Private Declare Function FindWindowEx Lib "user32" Alias "FindWindowExA" (ByVal Hwnd1 As Long, ByVal Hwnd2 As Long, ByVal lpsz1 As String, ByVal lpsz2 As String) 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 Sub Form_Load()
Shell "calc.exe", vbNormalNoFocus
End Sub

Private Sub Command1_Click()
Dim Hwnd1 As Long
Dim Hwnd2 As Long
Hwnd1 = FindWindow("SciCalc", "计算器")
Hwnd2 = FindWindowEx(Hwnd1, 0, "Button", "1")
SendMessage Hwnd2, WM_LBUTTONDOWN, ByVal 0&, ByVal 0&
SendMessage Hwnd2, WM_LBUTTONUP, ByVal 0&, ByVal 0&
End Sub

dbcontrols 2011-05-10
  • 打赏
  • 举报
回复
你有可能没有真正地得到句柄
与是否外部关系不大
[Quote=引用 9 楼 lwy7758 的回复:]
To dbcontrols,
你是在一个窗体上试的吗? 我是调用的外部程序上的button哦
[/Quote]
lwy7758 2011-05-10
  • 打赏
  • 举报
回复
To dbcontrols,
你是在一个窗体上试的吗? 我是调用的外部程序上的button哦
lwy7758 2011-05-10
  • 打赏
  • 举报
回复
我的代码:

被调用Form:

Private Sub Command1_Click()
Msgbox "OK"
End Sub


调用Form

Private Sub Command1_Click()
Hwd = FindWindow(vbNullString, "Form1")
HwdButton = FindWindowEx(Hwd, 0, vbNullString, "Command1")
PostMessage HwdButton, BM_CLICK, 0, 0
'PostMessage HwdButton, WM_LBUTTONDOWN, 0, 0
'PostMessage HwdButton, WM_LBUTTONUP, 0, 0
End Sub
dbcontrols 2011-05-10
  • 打赏
  • 举报
回复
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
Private Const WM_LBUTTONDOWN = &H201
Private Const WM_LBUTTONUP = &H202
Private Sub Command1_Click()
MsgBox "123"
End Sub

Private Sub Command2_Click()
PostMessage Command1.hwnd, WM_LBUTTONDOWN, 0, 0
PostMessage Command1.hwnd, WM_LBUTTONUP, 0, 0
End Sub
lwy7758 2011-05-10
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 dbcontrols 的回复:]

我这里没问题
引用 3 楼 lwy7758 的回复:
To dbcontrols:
你这样我也试过,还是不行的.
[/Quote]

dbcontrols, 你的被调用的button是什么事件呢? 我的是Msgbox "OK".
我现在发现是这样的情况, 如果用PostMessage WM_LBUTTONDOWN和WM_LBUTTONUP, 第一点击还是没作用, 但第二次点击,就可以了,然后"OK"的对话框弹出后,只要不关闭这个对话框, 就还是可以继续PostMessage WM_LBUTTONDOWN和WM_LBUTTONUP, 然后对话框会一直弹出来.

但如果是PostMessage BM_CLICK, 启动后第一次点击也是没作用, 等第二次点击, "OK"对话框弹出后, 不关闭对话框, 继续PostMessage BM_CLICK, 发现对话框不会继续弹出.
lwy7758 2011-05-10
  • 打赏
  • 举报
回复
难道跟lParam参数有关?
dbcontrols 2011-05-10
  • 打赏
  • 举报
回复
我这里没问题
[Quote=引用 3 楼 lwy7758 的回复:]
To dbcontrols:
你这样我也试过,还是不行的.
[/Quote]
lwy7758 2011-05-10
  • 打赏
  • 举报
回复
To dbcontrols:
你这样我也试过,还是不行的.
dbcontrols 2011-05-10
  • 打赏
  • 举报
回复
Private Const WM_LBUTTONDOWN = &H201
Private Const WM_LBUTTONUP = &H202

PostMessage HwdButton, WM_LBUTTONDOWN, 0, 0
PostMessage HwdButton, WM_LBUTTONUP, 0, 0

7,763

社区成员

发帖
与我相关
我的任务
社区描述
VB 基础类
社区管理员
  • VB基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧