1个简单的vb问题,如何让msgbox被自动点击

2024-12-19 23:44:05
推荐回答(3个)
回答1:

可以做到,其实这不是一个简单的问题。我曾经用c做过。而且是处理可能是别的程序的MsgBox. 代码是:
HWND hpop, hbutton;
int nID;
hpop = FindWindow(NULL, "窗口标题"); //根据msgbox的标题寻找其窗口句柄。
if (hpop) { //如果找到了,
hbutton = FindWindowEx(hpop, NULL, "TButton", NULL); //再找类型为按钮的控件句柄。
nID = GetDlgCtrlID(hbutton); //肯定找的到,所以就不判断了,直接转换为id.
SendMessage(hpop, WM_COMMAND, MAKEWPARAM(nID, BN_CLICKED), (LPARAM)hbutton); //送他一个click.
}
FindWindowEx找类型为按钮("TButton"类型. 你VB中可能不一样,可能就是"Button")的控件句柄也可以根据按钮文字来找。
此段子程序应使用Timer每一秒执行一次,只要发现有这个msgbox, 就会给他一个click, 很好用的。
其中所有函数都是API. 如果理解了,转换成VB不会有困难。
同意这样处理Msgbox是治标不治本。在治本有困难时,治治标也未尝不可。

附:
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
'寻找窗口列表中第一个符合指定条件的顶级窗口
'lpClassName指向包含了窗口类名的空中止(C语言)字串的指针;或设为零,表示任何类
'lpWindowName指向包含了窗口文本(或标签)的空中止(C语言)字串的指针;或设为零,表示任何窗口标题

Private Declare Function FindWindowEx Lib "user32" Alias "FindWindowExA" (ByVal hWnd1 As Long, ByVal hSubWnd As Long, ByVal lpClassName As String, ByVal lpText As String) As Long
'在窗口列表中寻找与指定条件相符的第一个子窗口
'hWnd1在其中查找子的父窗口
'hSubWnd2从这个子窗口后开始查找。这样便可利用对FindWindowEx的多次调用找到符合条件的所有子窗口。如设为零,表示从第一个子窗口开始搜索
'lpClassName类型名。或设为零表示任何类
'lpText 子窗口标题或文字。或设为零,表示任何窗口标题

回答2:

奇怪的想法,既然你不想用户干预为什么要用Msgbox?
最简单就是做个Form,加个Timer定时Unload

补充:
原来如此,你的问题是网络延时和同步执行的问题,加Msgbox是治标不治本因为你不知道网络延时有多久
解决的方法是改用多线程异步执行,调用API函数CreateThread创建一个后台线程进行socket操作,完成操作后通知主线程继续下一步

回答3:

需要用到windows api。哥哥,我不会。