Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Problem beim Fenster finden! (https://www.delphipraxis.net/49466-problem-beim-fenster-finden.html)

-=IOI=- 11. Jul 2005 21:59


Problem beim Fenster finden!
 
Hallo alle zusammen.

Bin gerade dabei ein ICQ-Clone zu proggen und bin nun auf folgendes Problem gestoßen:

Mit folgender Prozedur öffne ich ein neues Nachrichtenfenster, wenn ich eine Nachricht erhalte:

Delphi-Quellcode:
procedure TForm1.ICQClient1MessageRecv(Sender: TObject; Msg, UIN: String);
var
  i: Integer;
  ListItem: TListItem;
  FNick, min1: String;
  DateTime: TDateTime;
  Hour, Min, Sec, Msec: Word;
begin
  DateTime := now;
  DecodeTime(DateTime, Hour, Min, Sec, Msec);
  Min1 := IntToStr(Min);
  if Length(Min1) = 1 then Min1 := '0' + Min1;
  with TMessage.Create(nil) do
  begin
    FNick := UIN;
    if ListView1.Items.Count > 0 then
      for i := 0 to ListView1.Items.Count - 1 do
        if ListView1.Items.Item[i].Caption = UIN then
        begin
          ListItem := ListView1.Items.Item[i];
          Self.IconList.GetIcon(StrToInt(ListItem.SubItems[LV_INDEX_STATUS]), Image1.Picture.Icon);
        end;
    Self.AdvIconList.GetIcon(0, Self.Icon);
    if ListView1.Items.Count > 0 then
      for i := 0 to ListView1.Items.Count - 1 do
        if ListView1.Items.Item[i].Caption = UIN then
        begin
          ListItem := ListView1.Items.Item[i];
          FNick := ListItem.SubItems[LV_INDEX_NICK];  //Nick
          Break;
        end;
    Caption := FNick;
    Nick.Text := FNick;
    Nummer.Text := UIN;
    Text.Font.Color := clred;
    Text.Font.Size := 10;
    Text.Lines.Add(FNick+' ('+IntToStr(Hour)+':'+min1+'):');
    Text.Font.Color := clblack;
    Text.Font.Size := 8;
    Text.Lines.Add(Msg);
    Text.Lines.Add('');
    Show;
  end;
end;
Nun kommt es ja aber nicht selten vor, dass man von einem User bereits eine Nachricht erhalten hat und somit schon ein Fenster offen ist.

Wie kann ich nun also herausfinden, ob von dem User schon ein Fenster offen ist (gebe jedem Fenster den Nickname des Users als Titel)? Und falls ja, wie kann ich dann eine neu erhaltene Nachricht an das Memo mit dem Namen Text des geöffneten Fenster weiterleiten (die Nachricht liegt in einer variablen vom Typ String).

PS: Jedes Fenster hat 2 Memo-Felder, müsste also irgendwie über den Namen laufen.

Gruß Flo

SirThornberry 11. Jul 2005 22:04

Re: Problem beim Fenster finden!
 
speicher einfach alle fenster die du öffnest in einer Liste. Und wenn du ein Fenster öffnest kannst du ja dem TForm auch ein Property geben welches festhält von welchem User das Fenster ist. Und wenn da wieder eine message kommst brauchst du nur die Liste durchgehen und überprüfst ob in der Liste schon ein Fenster von UserX ist.

jfheins 11. Jul 2005 22:07

Re: Problem beim Fenster finden!
 
Mit folgendem Code kann man (zumindest bei mir) das ICQ-Messagefenster finden:
Delphi-Quellcode:
var
  wnd: HWND;
begin
  wnd := FindWindow('#32770','');
  if wnd <> 0 then
  begin
   // Fenster vorhanden
  end;
end.
Und das Memo für die Nachricht entsprechend so:
Delphi-Quellcode:
var
  wnd: HWND;
begin
  wnd := FindWindow('#32770','');
  wnd := FindWindowEx(wnd, 0, 'RichEdit20A', nil);
  if wnd <> 0 then
  begin
   // Femster vorhanden
  end;
end.
Generated by WinSpy ;)

aso - du öffnest die fenster selber und willst wissen, welches du schon offen hast ... dann einfach eine property UIN oder so, und beim erhalten alle vorhandenen durchgehen und testen, ggf. Nachricht einfügen. Und wenn keines da ist, einfach ein neues erzeugen ;) - Also siehe SirT :(

Ich bin einfach zu langsam :cry:

Und dann ist der Code auch noch falsch :wall: :wall: :wall: :wall:

:? Ich sollte ins Bett ...

Luckie 11. Jul 2005 22:10

Re: Problem beim Fenster finden!
 
Delphi-Quellcode:
wnd := FindWindow('#32770','');
Damit findest du alle Fenster die mit dem Ressourceneditir von VC erstellt wurden, da sie standardmäßig die Fensterklasse #32770 bekommen.

-=IOI=- 11. Jul 2005 22:16

Re: Problem beim Fenster finden!
 
Ok, das mit dem Fenster finden werde ich dank der Tips hier hinbekommen.

Nur wie mache ich es dann, dass er mir die Nachricht bei bereits geöffnetem Fenster in das Memo Feld schreibt?


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:18 Uhr.

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