有一个软件开始的时候要输入用户名和密码,于是我写了个自动登录程序来自动登录,实践证明能登录,可是,我的程序却不能关闭了。晕死~~~~。
自动登录的函数如下:
procedure TMainForm.AutoLogin;
var Mhwnd:integer;
begin
  Mhwnd := FindWindow(nil, '管理员登录');
  while (Mhwnd = 0) do
  begin
    Mhwnd := FindWindow(nil, '管理员登录');
    Application.ProcessMessages;
    Sleep(20);
  end;
  SetChildwindowsProc(Mhwnd, AdminName);
  sleep(50);
  SetNextChildWindowsProc(Mhwnd, AdminPassword);
  PostMessage(MHwnd, WM_Command, 1, BN_CLICKED);
end;
当我不执行这个函数的时候,什么问题都没有的,一旦执行这个函数, 当我Close我的程序的时候,程序最后就一直在这个函数的while中进行循环。而我Close的时候是什么动作都没有的,就简单的一句Self.Close,我试着单步跟踪,发现他一直在循环......请教各位大侠,有什么方法可以改善上面的函数吗?因为winsdk中的函数我都掌握的比较差....

解决方案 »

  1.   

    procedure TMainForm.AutoLogin;
    var Mhwnd:integer;
    begin
      Mhwnd := FindWindow(nil, '管理员登录');
      if Mhwnd = 0 then
      begin
        Exit;
      end;
      SetChildwindowsProc(Mhwnd, AdminName);
      sleep(50);
      SetNextChildWindowsProc(Mhwnd, AdminPassword);
      PostMessage(MHwnd, WM_Command, 1, BN_CLICKED);
    end;
    用个TTimer一直调用它就不会了。
      

  2.   

    当你执行了Mhwnd := FindWindow(nil, '管理员登录');
    以后,Mhwnd=0;
    你用WHILE WHWND=0 DO
    BEGIN
    中间没有跳出循环,
    END
    当然是死循环了!!!!
      

  3.   

    Mhwnd := FindWindow(nil, '管理员登录');
      if mhwnd = 0 then
        begin
          showmessage('没有找到登陆窗口');
          abort;
        end;找一遍就行了,如果找不到循环找也是没有的,然后放在timer中,定时查找
      

  4.   

    在你的 OnClose 中写一句
     Application.Terminate上面的修改为:
     while ((Mhwnd = 0) and (not Application.Terminated)) do
    ....
      

  5.   

    在你的 OnClose 中写一句
     Application.Terminate上面的修改为:
     while ((Mhwnd = 0) and (not Application.Terminated)) do
    ....