在这2014年以前的卖家旺旺版的聊天记录窗口 是由微软的IE控件生成的,可以直接通过以下 delphi源码直接获取: type TObjectFromLResult = function(LRESULT: lResult; const IID: TGUID; WPARAM: wParam; out pObject): HRESULT; stdcall;
function GetIEFromHWND(WHandle: HWND; var IE: IWebbrowser2): HRESULT; var hInst: HWND; lRes: Cardinal; MSG: Integer; pDoc: IHTMLDocument2; ObjectFromLresult: TObjectFromLresult; begin hInst := LoadLibrary('Oleacc.dll'); @ObjectFromLresult := GetProcAddress(hInst, 'ObjectFromLresult'); if @ObjectFromLresult <> nil then begin try MSG := RegisterWindowMessage('WM_HTML_GETOBJECT'); SendMessageTimeOut(WHandle, MSG, 0, 0, SMTO_ABORTIFHUNG, 1000, lRes); Result := ObjectFromLresult(lRes, IHTMLDocument2, 0, pDoc); if Result = S_OK then (pDoc.parentWindow as IServiceprovider).QueryService(IWebbrowserApp, IWebbrowser2, IE); finally FreeLibrary(hInst); end; end; end;
function EnumChildProc(H: hwnd; LP: integer): boolean; stdcall; var p: pChar; ie: IWebbrowser2; begin result := true; GetMem(p, 255); GetClassName(h, p, 255); try if p = 'Internet Explorer_Server' then begin // result := false; if GetIEFromHWND(h, ie) = s_OK then begin form1.mmo1.Lines.Add((ie.Document as IHTMLDocument2).body.outertext) end; end; finally FreeMem(p, 255); end;
end;
procedure TForm1.tmr1Timer(Sender: TObject); var h: hwnd; buffer: array[0..512] of char; begin h := FindWindow('StandardFrame', '聊天窗口标题'); if h <> 0 then EnumChildWindows(h, @EnumChildProc, LongInt(@ buffer[0])); //很奇怪,用 findwindowEx 传递 IE 的 ClassName 找不到结果,所以了窗口枚举