有一个软件开始的时候要输入用户名和密码,于是我写了个自动登录程序来自动登录,实践证明能登录,可是,我的程序却不能关闭了。晕死~~~~。
自动登录的函数如下:
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中的函数我都掌握的比较差....
自动登录的函数如下:
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中的函数我都掌握的比较差....
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一直调用它就不会了。
以后,Mhwnd=0;
你用WHILE WHWND=0 DO
BEGIN
中间没有跳出循环,
END
当然是死循环了!!!!
if mhwnd = 0 then
begin
showmessage('没有找到登陆窗口');
abort;
end;找一遍就行了,如果找不到循环找也是没有的,然后放在timer中,定时查找
Application.Terminate上面的修改为:
while ((Mhwnd = 0) and (not Application.Terminated)) do
....
Application.Terminate上面的修改为:
while ((Mhwnd = 0) and (not Application.Terminated)) do
....