function TForm1.mygettext(hwnd:THandle):string; var buf:pchar; len:Longint; begin Len:=Longint(SendMessage(hWnd,WM_GETTEXTLENGTH ,0,0)); if len>0 then begin//1 try getmem(buf,len); SendMessage(hWnd,WM_GETTEXT,Len+1,Int64(buf)); Result:=strpas(buf); finally freemem(buf); end; end;//1 end; procedure TForm1.Button2Click(Sender: TObject); var i, hwnd: Integer; msg: string; begin {Static} hwnd := FindWindow(nil, '计算器'); if hwnd <> 0 then begin hwnd := findwindowEx(hwnd, 0,'Static', nil); edit1.Text :=mygettext(hwnd) end; end;
sg := '$PARA' + sg;
formhwnd := FindWindow('TfrmCdMain','');
SendMessage(formhwnd , WM_SETTEXT, 0, integer(@sg[1]));
var
buf:pchar;
len:Longint;
begin
Len:=Longint(SendMessage(hWnd,WM_GETTEXTLENGTH ,0,0));
if len>0 then
begin//1
try
getmem(buf,len);
SendMessage(hWnd,WM_GETTEXT,Len+1,Int64(buf));
Result:=strpas(buf);
finally
freemem(buf);
end;
end;//1
end;
procedure TForm1.Button2Click(Sender: TObject);
var
i, hwnd: Integer;
msg: string; begin
{Static}
hwnd := FindWindow(nil, '计算器');
if hwnd <> 0 then
begin
hwnd := findwindowEx(hwnd, 0,'Static', nil);
edit1.Text :=mygettext(hwnd)
end;
end;
formhwnd := FindWindow('TfrmCdMain','');//QQ窗主界面窗口的类名是TfrmCdMain?
//后面的参数应该是 nil 吧,如果是空串不知道能不能找到?
SendMessage(formhwnd , WM_SETTEXT, 0, integer(@sg[1]));
fromhwnd : integer;
begin
formhwnd := FindWindow('TfrmCdMain','');
SendMessage(formhwnd , WM_SETTEXT, 0, integer(@sg[1]));
end;
你用SPY++自己侦测一下吗?然后配合FindWindow就可以找到窗口,然后使用FindWindowEx找到“发送”的句柄,发WM_LBUTTONDOWN 消息就OKformhwnd := FindWindoEx(‘’, '');
是找到类TfrmCdMain的窗口的句柄,不是QQ的
SendMessage(formhwnd , WM_SETTEXT, 0, integer(@sg[1]));
是写字符进去,看来哥们还没有高清楚WM_SETTEXT应该是这样
hwnd := FindWindow(‘此处是你用SPY++找到的QQ登陆窗口类’,nil);
if hwnd <> 0 then
begin
formhwnd := FindWindoEx(hwnd,0,nil, '登陆QQ');
SendMessage(formhwnd,WM_LBUTTONDOWN, 0, 0)
END
第一个参数是你操作的对象句柄,
第二个是你命令他干什么
TQQLogin = class(TObject)
private
FTimer: TTimer;
FUserId: String;
FPassword: String;
FApplicationPath: String;
public
constructor Create(AUserName , APassword, APath: String);
destructor Destroy; override;
procedure QQLogin;
procedure FTimerTimer(Sender: TObject);
end;
Var
QQHandle, //QQ主窗口句柄
HPasswordEdit, //QQ密码框句柄
HNumberEdit, //QQ用户名编辑框
HLoginButton, //登陆按钮句柄
HSpecialHandle: THandle; //特殊按钮句柄 FQQVersion: PChar; //QQ版本implementation
function FindQQWindow: THandle; function GetSpecialButtonHandle(hwnd: HWND; lParam: LPARAM):Boolean; stdcall;
var
cName: array[0..128] of Char;
wName: array[0..128] of Char;
begin
result := true;
GetClassName(hwnd, cName, 128);
if StrPas(cName) = 'Button' then
begin
GetWindowText(hwnd, wName, 128);
if StrPas(wName) = '软键盘'then
begin
FQQVersion := 'V2004Beta';
PInteger(lParam)^ := hwnd;
result := false;
end;
if StrPas(wName) = '注册向导' then
begin
FQQVersion := 'V2003';
PInteger(lParam)^ := hwnd;
result := false;
end;
end;
end; function EnumWindowsProc(hwnd: HWND; lParam: LPARAM): boolean; stdcall;
var
eName: array[0..180] of Char;
begin
Result := true;
if hwnd = 0 then Exit;
GetClassName(hwnd, eName, 32); If CompareText('#32770', StrPas(eName))<>0 Then Exit; EnumChildWindows(hwnd, @GetSpecialButtonHandle, Integer(@HSpecialHandle));
if HSpecialHandle <> 0 then
Begin
QQHandle:= hwnd;
Result := False;
End;
end;
begin
QQHandle:= 0;
EnumWindows(@EnumWindowsProc, 0);
Result:= QQHandle;
end;procedure GetQQHandle;
Var
eHandle: THandle;
begin
eHandle:= FindQQWindow;
if eHandle<>0 then
begin
HPasswordEdit:= FindWindowEx(eHandle, 0, 'Edit', nil);
HNumberEdit:= FindWindowEx(eHandle, 0, 'Combobox', nil);
HLoginButton:= FindWindowEx(eHandle, 0, 'Button', '登录');
end;
end;{ TQQLogin }constructor TQQLogin.Create(AUserName , APassword, APath: String);
begin
FUserId := AUserName;
FPassword := APassword;
FApplicationPath := APath;
Winexec(PChar(APath), SW_SHOW);
FTimer:= TTimer.Create(nil);
FTimer.Interval := 1000;
FTimer.OnTimer := FTimerTimer;
FTimer.Enabled := false;
end;
destructor TQQLogin.Destroy;
begin
FTimer.Free;
inherited;
end;{-------------------------------------------------------------------------------procedure TQQLogin.FTimerTimer(Sender: TObject);
var
i: integer;
begin
GetQQHandle; If (HNumberEdit=0) or (HPasswordEdit=0) or (HLoginButton=0) Then Exit; SendMessage(HNumberEdit, WM_SETTEXT, 0, Integer(FUserId)); if FQQVersion = 'V2004Beta' then
begin
For I:= 1 To Length(FPassword) Do
SendMessage(HPasswordEdit, WM_USER+513, Integer(FPassword[I]), 0);
end
else
begin
For I:= 1 To Length(FPassword) Do
begin
SendMessage(HPasswordEdit, WM_CHAR, Integer(FPassword[I]), 0);
end;
end; SendMessage(HLoginButton, WM_LBUTTONDOWN, 0, 0);
SendMessage(HLoginButton, WM_LBUTTONUP, 0, 0); FTimer.Enabled := False;
Free;
end;说明: 开始登陆
procedure TQQLogin.QQLogin;
begin
FTimer.Enabled := True;
end;end.