Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi ICQ 6.5 Away Nachricht setzen (https://www.delphipraxis.net/138170-icq-6-5-away-nachricht-setzen.html)

Muellermilchtrinker 4. Aug 2009 18:01


ICQ 6.5 Away Nachricht setzen
 
Ich hab da mal ne Frage. Wie kann man in ICQ 6.5 die Away Nachricht über Delphi ändern?
Es gibt ja in der Code-Libary diesen Code:Code-Libary Eintrag
Nur leider klappt das nicht mit ICQ 6.5.
Ich hoffe das ihr mir helfen könnt.

lowF 17. Aug 2009 10:34

Re: ICQ 6.5 Away Nachricht setzen
 
Hi

Ich hab mal n Code geschrieben, welcher das über Windows API versucht, ziemlich unsauber, da das Awaymsg Fenster für ne Zehntel Sekunde sichtbar ist und man evt aus ner Vollbildanwendung tabbed.
Wenn das trotzdem was für deinen Geschmack ist, meld dich mal.

toms 17. Aug 2009 10:37

Re: ICQ 6.5 Away Nachricht setzen
 
Zitat:

Zitat von Muellermilchtrinker
Nur leider klappt das nicht mit ICQ 6.5.
Ich hoffe das ihr mir helfen könnt.

Hast du überprüft, ob die Fenster gefunden werden (= Handles gültig sind)?

Muellermilchtrinker 18. Aug 2009 10:15

Re: ICQ 6.5 Away Nachricht setzen
 
@lowF: Du hast ne PN.

Muellermilchtrinker 13. Sep 2009 16:30

Re: ICQ 6.5 Away Nachricht setzen
 
lowF hat mir gestern den Code zu kommen lassen und möchte den euch nicht enthalten.
Also hier ist der Code:
(Getestet hab ichs noch nicht)
Delphi-Quellcode:
var wlist : TWindowList;
    i : integer;
    ICQ : hwnd;
    ICQ2 : hwnd;
    LongParam : integer;
    lPoint : TPoint;
    App : hwnd;
    x : cardinal;
    Document: IHTMLDocument3;
    ele: IHTMLElement;

    MSG : string;
begin
  app := GetForegroundWindow;
  wlist := TWindowList.Create;
  wlist.ShowUnvisibleWindows := true;
  wlist.EnumTopLevelWindows;

  for i := 0 to wlist.Count-1 do
    if pos('Winamp',wlist[i]) > 0 then
      MSG := Copy(wlist[i],1,Pos('Winamp',wlist[i])-3);




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


  lPoint.X := 80;
  lPoint.Y := 80;
  LongParam := lPoint.X + lPoint.Y shl 16;

  PostMessage(ICQ, WM_LBUTTONDOWN, MK_LButton,LongParam);
  PostMessage(ICQ, WM_LBUTTONUP, MK_LButton, LongParam);

  x := gettickcount;
  repeat
    Application.ProcessMessages;
  until
    GetTickCount - x > strtoint(Edit1.Text);
  wlist.EnumTopLevelWindows;

  for i := 0 to wlist.Count-1 do
    if wlist[i] = 'Persönlicher Statusmanager' then
      ICQ2 := wlist.Handles[i];

  //Message festlegen
  if length(song) > 0 then
    MSG := '[b]Now playing: [/b][i]'+song+'[/i]'
  else
    MSG := '[b]Nothing playing right now![/b]';


  wlist.EnumChildWindows(icq2);


  lPoint.X := 285;
  lPoint.Y := 200;
  LongParam := lPoint.X + lPoint.Y shl 16;
  //PostMessage(ICQ2,WM_SETFOCUS,0,0);
  PostMessage(ICQ2, WM_LBUTTONDOWN, MK_LButton,LongParam);
  PostMessage(ICQ2, WM_LBUTTONUP, MK_LButton, LongParam);

  //Apply text
  GetHTMLFromHWnd(wlist.Handles[1],Document);

  try
  (Document.documentElement.document AS IHTMLDocument2).body.innerHTML := MSG;
  except
    Edit1.Text := '200';
  end;

  wlist.Destroy;

  lPoint.X := 285;
  lPoint.Y := 350;
  LongParam := lPoint.X + lPoint.Y shl 16;
  //PostMessage(ICQ2,WM_SETFOCUS,0,0);
  PostMessage(ICQ2, WM_LBUTTONDOWN, MK_LButton,LongParam);
  PostMessage(ICQ2, WM_LBUTTONUP, MK_LButton, LongParam);


  //PostMessage(App,WM_SETFOCUS,0,0);

lowF 13. Sep 2009 17:12

Re: ICQ 6.5 Away Nachricht setzen
 
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:
Delphi-Quellcode:
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:
Delphi-Quellcode:
 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 Statusmanager' then
      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.

Muellermilchtrinker 13. Sep 2009 17:27

Re: ICQ 6.5 Away Nachricht setzen
 
Ich bekomm leider ne Zugriffsverletzung bei:
Delphi-Quellcode:
  (Document.documentElement.document AS IHTMLDocument2).body.innerHTML := MSG;

lowF 13. Sep 2009 19:02

Re: ICQ 6.5 Away Nachricht setzen
 
Kannst du überprüfen, ob
Delphi-Quellcode:
GetHTMLFromHWnd(wlist.Handles[1],Document);
funktioniert hat, bzw. Document danach <> nil ist?
Sicher, dass nicht bei GetHTMLFromHwnd die AV ist?

Muellermilchtrinker 13. Sep 2009 19:13

Re: ICQ 6.5 Away Nachricht setzen
 
jetzt hab ich 'Listenindex überschreitet das Maximum(1)' Meldung

lowF 13. Sep 2009 19:29

Re: ICQ 6.5 Away Nachricht setzen
 
Hast du die Deutsche Version von ICQ 6.5 - und sie läuft auch gerade? Und du bist eingeloggt?


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:17 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz