GlobalFree(Data);这一行报下面的错误 Incompatible types: 'Cardinal' and 'PAnsiChar'
function Process_Start(P:pointer):boolean;stdCall; var ProHandle:THandle; PC:TPoint; R:TRect; wndClass: array[0..100] of Char; Data: PChar; iLen: DWORD; str: String; begin ProHandle:=FindWindowEx(0,0,nil,'Form1'); Process.Memo1.Lines.Insert(0,inttostr(ProHandle)); if ProHandle<>0 then begin GetWindowRect(ProHandle,R); PC:=R.TopLeft; PC.X:=PC.X+100; PC.Y:=PC.Y+100; ProHandle:=ChildWindowFromPoint(ProHandle,PC); if ProHandle<>null then begin GetClassName(ProHandle,wndClass,255); iLen := MAX_PATH; Data := PChar(GlobalAlloc(GPTR, iLen)); iLen := ListView_GetItemText(ProHandle,0 ,3,Data ,iLen); SetString(Str,Data,iLen); Process.Memo1.Lines.Insert(0,string(wndClass)+'------------'+inttostr(ProHandle)+'-----'+str); GlobalFree(Cardinal(Data)); end; end; end; 输出str为空
如上图,现在我能取得这个ListView的Handle,但不知道怎样通过
SendMessage取得里面的数据项如880.00
CommCtrl;var
str: String;
begin
SetLength(Str,MAX_PATH);
SetLength(Str,ListView_GetItemText( ListView1.Handle,0 (*第I+1行*),3(*第J+1列*),PChar(Str),MAX_PATH));
ShowMessage(str);
end;
http://blog.myspace.cn/1304962666/archive/2008/03/02/400443737.aspx2. 原理:HOOK进入其他程序进程-》创建代理窗体-》内存共享-》利用RTTI获取内容。
http://www.3800hk.com/Article/cxsj/delphi/yswddp/2005-08-20/Article_53237.html
-------------------------------------------------------
Handle我换成的是第三方软件ListView的Handle,但程序正式运行时提示内存异常,然后第三方软件就自动关闭了
Windows;
...
var
Data: PChar;
iLen: DWORD;
str: String;
begin
iLen := MAX_PATH;
Data := PChar(GlobalAlloc(GPTR, iLen));
iLen := ListView_GetItemText( ListView_Handle,0 (*第I+1行*),3(*第J+1列*),Data ,iLen));
SetString(Str,Data,iLen);
GlobalFree(Data);
ShowMessage(str);
end;
Incompatible types: 'Cardinal' and 'PAnsiChar'
var
ProHandle:THandle;
PC:TPoint;
R:TRect;
wndClass: array[0..100] of Char;
Data: PChar;
iLen: DWORD;
str: String;
begin
ProHandle:=FindWindowEx(0,0,nil,'Form1');
Process.Memo1.Lines.Insert(0,inttostr(ProHandle));
if ProHandle<>0 then
begin
GetWindowRect(ProHandle,R);
PC:=R.TopLeft;
PC.X:=PC.X+100;
PC.Y:=PC.Y+100;
ProHandle:=ChildWindowFromPoint(ProHandle,PC);
if ProHandle<>null then
begin
GetClassName(ProHandle,wndClass,255);
iLen := MAX_PATH;
Data := PChar(GlobalAlloc(GPTR, iLen));
iLen := ListView_GetItemText(ProHandle,0 ,3,Data ,iLen);
SetString(Str,Data,iLen);
Process.Memo1.Lines.Insert(0,string(wndClass)+'------------'+inttostr(ProHandle)+'-----'+str);
GlobalFree(Cardinal(Data));
end;
end;
end;
输出str为空