关于通过API 捕捉另一个应用程序窗体,并输入值,点确认后,屏蔽另一个应用程序弹出MSGBOX对话框的问题

udSoft2020 2009-02-20 01:45:52
代码如下:

Option Explicit
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 Const WM_SETTEXT = &HC
Private Const BM_CLICK = &HF5

Private Const WM_CLOSE = &H10

Private Sub Command1_Click()

DoEvents

Dim QQHwnd As Long, RHwnd As Long, subhwnd As Long

QQHwnd = FindWindow(vbNullString, "请输入密码") '捕捉窗口
subhwnd = FindWindowEx(QQHwnd, 0, "EDIT", vbNullString)


Do While subhwnd > 0
subhwnd = FindWindowEx(QQHwnd, subhwnd, "EDIT", vbNullString) '捕捉第2个文本框
Exit Do

Loop

RHwnd = FindWindowEx(QQHwnd, 0, "Button", "确认")

SendMessage subhwnd, WM_SETTEXT, 0, ByVal Text1.Text 'Text2文本框内为 主程序放入另一个应用程序的文本框的值.
SendMessage RHwnd, BM_CLICK, 0, 0 '点击登录按钮
SendMessage RHwnd, BM_CLICK, 0, 0 '点击登录按钮 好象要有两个才会成功点到这个<确认>按钮

DoEvents
* RHwnd = FindWindow(vbNullString, "密码错误")
'上面这句 在调试时 该行,在另一个应用程序点了 确认 弹出了一个密码错误框时,程序停止,这句话执行不到了,点了确认才运行到这句!!!!!
If RHwnd > 0 Then SendMessage RHwnd, WM_CLOSE, 0, 0
DoEvents
End Sub



代码结束

不知道为什么,另一个程序弹出了一个 MSGBOX对话框,程序就停止了,点了另一个程序的 确认按钮,程序才继续运行
试了把*号以下的代码放到TIMER1里也是执行不到的!!
...全文
185 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
bob008 2009-02-28
  • 打赏
  • 举报
回复
直接后台鼠标点击,这样,比较异形的非常规按钮控件也可以点击了。。。 比如有的程序的按钮控件是自己写的或者用图片或者捕捉鼠标区域的。 用后台鼠标点击解决就很到位。。。
cnzdgs 2009-02-28
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 baso1623 的回复:]
必须是2个EXE吗?
[/Quote]
什么意思?


[Quote=引用 8 楼 myjian 的回复:]
引用 3 楼 cnzdgs 的回复:
帖子发重复了,也别浪费
哈哈,BS~~~~又来抢分
[/Quote]
不是抢分,是劫分,抢和劫的性质是不同滴。
主要是LZ自己已经回复了,没法删帖退分,没人劫就浪费了。
udSoft2020 2009-02-27
  • 打赏
  • 举报
回复
必须是2个EXE吗?
嗷嗷叫的老马 2009-02-27
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 cnzdgs 的回复:]
帖子发重复了,也别浪费[/Quote]
哈哈,BS~~~~又来抢分
cih2000zg 2009-02-26
  • 打赏
  • 举报
回复
时间间隔1000也可以。。不用检查那么频繁
cih2000zg 2009-02-26
  • 打赏
  • 举报
回复

* RHwnd = FindWindow(vbNullString, "密码错误")
'加个时钟时间间隔200
If RHwnd <> 0 Then
timer1.enable = true
end if
Private Sub timer_timer()
RHwnd = FindWindow(vbNullString, "密码错误")
If RHwnd <> 0 Then
SendMessage RHwnd, WM_CLOSE, 0, 0
else
timer1.enable = false
end if
end sub
fjwyshan 2009-02-21
  • 打赏
  • 举报
回复
ding
cnzdgs 2009-02-21
  • 打赏
  • 举报
回复
帖子发重复了,也别浪费,再补充一点:BM_CLICK消息有一些限制,经常不能正常响应,对于普通窗口,建议直接向按钮的父窗口发WM_COMMAND消息(BN_CLICKED)。
udSoft2020 2009-02-20
  • 打赏
  • 举报
回复
SendMessage RHwnd, BM_CLICK, 0, 0


好象要好几次才会运行到

可能不延时,不知道怎么改进成合理的
udSoft2020 2009-02-20
  • 打赏
  • 举报
回复
不知道程序逻辑上哪里出问题了

1,488

社区成员

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

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