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 wm_gettext gibt MANCHMAL(!) leeren buffer zurück...*heul* (https://www.delphipraxis.net/39071-wm_gettext-gibt-manchmal-leeren-buffer-zurueck-%2Aheul%2A.html)

prinz_inzide 28. Jan 2005 07:00


wm_gettext gibt MANCHMAL(!) leeren buffer zurück...*heul*
 
hi all!

ich hab jetzt mein programm soweit,dass es per timer immer dafür sorgt, dass alle icq-fenster (vorübergehend) in einer listbox dargestellt werden, um überrpüfen zu können ob er auch alle fenster findet.. macht er! klappt perfekt.

so, jetzt kommts:
dann hab ich nen 2. timer, der immer das hier macht:
Delphi-Quellcode:
procedure TForm1.Timer1Timer(Sender: TObject);
var
i:integer;
begin
if (form1.ListBox1.Items.Count>0) then
begin
  for i:=0 to form1.ListBox1.Items.Count do
  begin
    ein_fenster_checken(form1.ListBox1.Items.strings[i]);
  end;
end;
end;
(hab die schleife auch schon mit "for i:=0 to form1.ListBox1.Items.Count-1 do" versucht, bring aber das selbe ergebnis und zwar einfunktionierendes, hab mal zu testzwecken eine msgbox in die schleife eingebaut, hat alle fenster angezeigt...

Delphi-Quellcode:
function ein_fenster_checken(name:string):string;
var
fenster,memo: hwnd;
buffer: array[0..1024] of char;
i,position: integer;
eingetragen:boolean;
begin
fenster:=findwindow(nil,pchar(name));
if (fenster<>0) then
begin
  memo:= getdlgitem(fenster, 7001); //7001 ist das feld wo der nachrichtenverlauf drin steht
  if (memo<>0) then
  begin
    SendMessage(memo, wm_gettext, sizeof(buffer), Integer(@buffer));
    showmessage(string(buffer));// hab ich nur zu testzwecken drin
    if (string(buffer)<>'') then
    begin
      for i:=0 to high(uin) do
      begin
        if (uin[i].name=name) then //wenn schon vorhanden im array
        begin
          showmessage('user betreits angelegt');
        end;
        if (eingetragen=false) then
        begin
          showmessage('user wurde neu angelegt');
          setlength(uin,length(uin)+1);
          uin[high(uin)].name:=name;
        end;
      end;
    end;
  end;
end else
form1.ListBox1.Items.Delete(form1.ListBox1.Items.IndexOf(name));
das problem ist die zeile oben, wo er den buffer anzeigen soll:
wenn ich einen user im icq anklicke sodass sein fenster aufgeht und er z.b. eine N/A-message gesetzt hat, welche durch icq5 beim öffnen des user-fensters sofort angezeigt wird, bekomme ich die auch problemlos angezeigt (in meiner showmessage) anders, wenn ich mit ihm gechattet habe, das chat fenster von ihm geschlossen habe un des dann wieder auf mache (text steht dann ja noch drin) kommt eine leere msgbox!! wenn ich dem jenigen dann schreibe bekomm (weilsja per timer immer wieder gemacht wird) den kompletten nachrichtenverlauf...

könnt ihr euch das erklären??

bitte umn hilfe!

Assarbad 10. Feb 2005 10:54

Re: wm_gettext gibt MANCHMAL(!) leeren buffer zurück...*heul
 
Fenster sind durch keinerlei Konvention verpflichtet den Windows-Mechanismus zu benutzen um Text anzuzeigen. Beispiel TLabel.

mael 10. Feb 2005 11:39

Re: wm_gettext gibt MANCHMAL(!) leeren buffer zurück...*heul
 
Zitat:

Zitat von Assarbad
Fenster sind durch keinerlei Konvention verpflichtet den Windows-Mechanismus zu benutzen um Text anzuzeigen. Beispiel TLabel.

Zumal TLabel gar kein Fenster ist :zwinker:


Hast Du schon geprüft ob memo immer ein gültiges Handle ist? Eventuell wird durch das Verstecken/Anzeigen das Handle verändert womöglich sogar die Control-ID(7001).

Assarbad 10. Feb 2005 12:23

Re: wm_gettext gibt MANCHMAL(!) leeren buffer zurück...*heul
 
Zitat:

Zitat von mael
Zitat:

Zitat von Assarbad
Fenster sind durch keinerlei Konvention verpflichtet den Windows-Mechanismus zu benutzen um Text anzuzeigen. Beispiel TLabel.

Zumal TLabel gar kein Fenster ist :zwinker:

Das sollte es aussagen. Wenn du über ein TLabel hoverst, bekommst du nur das Handle des enthaltenden Fensters, da TLabels nur durch OnPaint() et. al. gezeichnet werden.

Zitat:

Zitat von mael
Hast Du schon geprüft ob memo immer ein gültiges Handle ist? Eventuell wird durch das Verstecken/Anzeigen das Handle verändert womöglich sogar die Control-ID(7001).

Dann wäre es aber Schließen vs. Neuerstellen. Ich kann zumindest sagen, daß ein normales Verstecken hier nix ändert.


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:22 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