Einzelnen Beitrag anzeigen

lowF

Registriert seit: 18. Dez 2008
37 Beiträge
 
#6

Re: ICQ 6.5 Away Nachricht setzen

  Alt 13. Sep 2009, 18:12
Ich nehm mir mal die Zeit, das etzwas zu verschönern und kommentieren

Was man braucht ist die EnumWindowUtil.pas (Meines Wissens hier im Forum irgentwo erhältich).


Folgende Header braucht man also noch:
EnumWindowUtil,MSHTML,ActiveX,OleCtrls, SHDocVw; Und folgende Funktion (nicht von mir!)
Delphi-Quellcode:
function GetHTMLFromHWND(WHandle: HWND; var html: IHTMLDocument3): HRESULT;
var
  hInst: HWND;
  lRes: Cardinal;
  MSG: Integer;
  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, IHTMLDocument3, 0, html);
    finally
      FreeLibrary(hInst);
    end;
  end;
end;
Und folgende Typdefinition:
 TObjectFromLResult = function(LRESULT: lResult; const IID: TIID; WPARAM: wParam; out pObject): HRESULT; stdcall;
Delphi-Quellcode:
const WAITTIME = 200;
const MSG = 'HI';
var wlist : TWindowList;
    i : integer;
    ICQ : hwnd;
    ICQ2 : hwnd;
    LongParam : integer;
    lPoint : TPoint;
    lStart : cardinal;
    Document: IHTMLDocument3;
    ele: IHTMLElement;
begin
  //Window List erstellen
  wlist := TWindowList.Create;
  //Auch unsichtbare Fenster anzeigen
  wlist.ShowUnvisibleWindows := true;
  //Alle Fenster auflisten
  wlist.EnumTopLevelWindows;

  //Nach dem ICQ Fenster gucken
  for i := 0 to wlist.Count-1 do
    if wlist[i] =('ICQ') then
      ICQ := Wlist.Handles[i];


  //Punkt, auf dem man den Maustrigger machen muss, um
  //das Away-Fenster zu erhalten
  lPoint.X := 80;
  lPoint.Y := 80;

  //Punkt für Windows konvertieren
  LongParam := lPoint.X + lPoint.Y shl 16;

  //Mouse klick
  PostMessage(ICQ, WM_LBUTTONDOWN, MK_LButton,LongParam);
  PostMessage(ICQ, WM_LBUTTONUP, MK_LButton, LongParam);


  //Gewisse Zeit waren, damit das Away Fenster auch aktiv ist!
  lStart := gettickcount;
  repeat
    Application.ProcessMessages;
  until
    GetTickCount - lStart > WAITTIME;

  //Erneut alle Fenster auflisten
  wlist.EnumTopLevelWindows;

  //Nach dem Away Fesnter suchen
  for i := 0 to wlist.Count-1 do
    if wlist[i] = 'Persönlicher Statusmanagerthen
      ICQ2 := wlist.Handles[i];

  //Alle Child Fenster vom Away Fenster aufzählen
  wlist.EnumChildWindows(icq2);


  //Focus setzen per Mouseclick!
  lPoint.X := 285;
  lPoint.Y := 200;
  LongParam := lPoint.X + lPoint.Y shl 16;
  PostMessage(ICQ2, WM_LBUTTONDOWN, MK_LButton,LongParam);
  PostMessage(ICQ2, WM_LBUTTONUP, MK_LButton, LongParam);



  //Apply text
  //HTML Document holen, in dem die Away msg steht
  GetHTMLFromHWnd(wlist.Handles[1],Document);

  //Text setzen
  try
  (Document.documentElement.document AS IHTMLDocument2).body.innerHTML := MSG;
  except
  //Hier Exception handler einfügen
  end;

  //WList zerstören, Fenster per Mouseclick schliessen.
  wlist.Destroy;

  lPoint.X := 285;
  lPoint.Y := 350;
  LongParam := lPoint.X + lPoint.Y shl 16;
  PostMessage(ICQ2, WM_LBUTTONDOWN, MK_LButton,LongParam);
  PostMessage(ICQ2, WM_LBUTTONUP, MK_LButton, LongParam);
end;
So sollte es funktionieren.
  Mit Zitat antworten Zitat