delphi2007 教程

delphi2007 教程

首页 新随笔 联系 聚合 管理
  1013 Posts :: 0 Stories :: 28 Comments :: 0 Trackbacks
关于WinExec的问题? Delphi / Windows SDK/API
http://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

posted on 2009-02-03 09:49 delphi2007 阅读(178) 评论(0)  编辑 收藏 引用
只有注册用户登录后才能发表评论。