关于WinExec的问题? Delphi / Windows SDK/APIhttp://www.delphi2007.net/DelphiAPI/html/delphi_20061114224727232.html
下面为A程序调用B程序,弹出B的登陆界面,自动填入用户名密码来自动登陆B
procedure TForm1.Image1Click(Sender: TObject);
var
FHwnd : THandle;
t1Hwnd:THandle;
t2Hwnd: THandle;
BHwnd: THandle;
begin
WinExec(Pchar('C:\B.exe'),0) ;
//run运行到这里为什么弹出了登陆界面,等待用户响应?
为什么不直接运行下面的自动填用户名密码登陆操作??
//但是奇怪的是用分步执行,就能执行下去,并自动登陆!!
FHwnd:=FindWindow(nil,'系统登录');
if fHwnd>0 then
begin
t1Hwnd:=FindWindowEx(FHwnd,0,'TComboBox',nil);
t2Hwnd:=FindWindowEx(FHwnd,0,'TEdit',nil);
BHwnd:=FindWindowEx(FHwnd,0,'TBitBtn',nil);
if t1Hwnd>0 then
SendMessage(t1Hwnd, WM_SETTEXT, 0, Integer(PChar(User)));
if t2Hwnd>0 then
SendMessage(t2Hwnd, WM_SETTEXT, 0, Integer(PChar(Pwd)));
if BHwnd>0 then
SendMessage(BHwnd, BM_CLICK, 0, 0);
end;
end;
情请高手指点!
因为启动进程需要一些时间(哪怕是几十微秒),而代码的执行速度是非常快的,此时可能已经执行完了查找窗口的代码。所以,WinExec(Pchar('C:\B.exe'),0)以后,适当延时一些时间,比如1秒左右,应该就会好一点。延时可以这样:
var
dwTickCount: DWORD;
begin
WinExec('C:\B.exe', 0);
// 延时1秒
dwTickCount := GetTickCount;
while GetTickCount() < dwTickCount + 1000 do
Application.ProcessMessages;
// 继续下一步
FHwnd:=FindWindow(nil,'系统登录');
...
end;
我顶你个肺
that sound great!
Very Good
我调用一般的两层程序,问题是不存在的
调用一个三层的程序,就出现上述问题
延时1秒后,问题解决
Thank you! 非常感谢老妖的再次指点!
good
顶