如何用外挂实现程序自动登录

来源:互联网 发布:js array 排序 编辑:程序博客网 时间:2024/05/10 06:21

前些公司的产品需要做一个自动登录的功能,就像外挂一样,把所有的心得写出来,所有的自动登录的软件的原理基本差不多.希望能起到抛砖引玉的作用.

下面就是要登录的对话框

 

为了避免公司版本,所以在此去除了公司的信息及LOGO,上面就是一个用户名和密码对话框,点击确定,登录
这个对话框是为C++开发的. 我们的自动登录工具是用DELPHI开发的

下面是我们自动登录的软件的对话框

现在简单介绍下主界面上的各功能的意思:
----------------------------------------文件框----------------------------------------
Login User
自动登录软件的用户名
Login Password
自动登录软件的密码
其他文本框内容跟自动登录无关,不作介绍

----------------------------------------按扭----------------------------------------
Start:启动要登录的主程序(由于主程序是以服务形式存在的,实际上就是启动服务)
Stop:退出已经登录的主程序(停止服务)

思路:
打开主程序,找到用户和密码的TEXT的句柄,输入值,再点击确定按扭,就这么简单

开始动手:
1.首先我们要找到登录窗体的句柄,在DELPHI中这是很简单的,我们可以用获取主窗口标题的方法得到

 

var
hwndLogin: integer;

hwndLogin := findWindow(nil, 'Welocme Login');    //得到登录窗体的句柄

if hwndLogin > 0 then
   begin
     EnumChildWindows(hwndLogin, @EnumChildProc, 0);   //枚举窗体中的控件
     //Wait the Mian Form.
   end
else
   begin
      showmessage('can not find login window,please confirm');
   end;

@EnumChildProc 是一个方法

function EnumChildProc(hwnd: HWND; lParam: LPARAM): BOOL; stdcall;
var
 WndClassName: array[0..254] of Char;
 WndCaption: array[0..254] of Char;
 Buf: array[0..254] of Char;
begin
 GetClassName(hwnd, WndClassName, 254);
 GetWindowText(hwnd, WndCaption, 254);

 //此类名可以用Microsoft Visual Studio 6.0 ToolsSpy++工具来获得
//注意在这里文本框的类名是"Edit",   而不是"TEXT"
 if trim(string(WndClassName)) = 'Edit' then         
 begin
   if times = 1 then
   begin
     times := 2;
     strPcopy(Buf, username);
     //这里就是把用户用sendmessage输入用户名文本框
     SendMessage(hwnd, WM_SETTEXT, 254, Integer(@Buf));      
   end
   else
   begin
     strPcopy(Buf, password);
     //这里就是把用户用sendmessage输入密码文本框
     SendMessage(hwnd, WM_SETTEXT, 254, Integer(@Buf));
   end;
 end;

 //找到按扭点击OK,进入
 if trim(string(WndCaption)) = '
&OK' then
 begin
   SendMessage(hwnd, BM_CLICK, 0, 0);
 end;
 Result := True;
end;
原创粉丝点击