Einzelnen Beitrag anzeigen

Benutzerbild von Helmi
Helmi

Registriert seit: 29. Dez 2003
Ort: Erding, Republik Bayern
3.323 Beiträge
 
Delphi XE2 Professional
 
#1

Probleme beim Auslesen von Festertext

  Alt 5. Jan 2015, 18:27
Hallo,

mit folgender Procedure starte ich ein Programm und lass mir dessen Handle zurückgeben:

Delphi-Quellcode:
function start_process(const FileName: String): THandle;
var
  StartupInfo: TStartupInfo;
  ProcessInfo: TProcessInformation;

begin
  //Rückgabewert vordefinieren
  Result := 0;

  If not FileExists(FileName) then
    exit;

  //Variable mit nullen auffüllen und Größe setzen
  FillChar(StartupInfo, SizeOf(TStartupInfo), 0);
  StartupInfo.cb := SizeOf(TStartupInfo);

  StartupInfo.dwFlags := STARTF_USESHOWWINDOW;
  StartupInfo.wShowWindow := SW_HIDE;

  If CreateProcess(nil, PChar(FileName + #0), nil, nil, false, 0, nil, nil,
                    StartupInfo, ProcessInfo) then
    begin
      If WaitForInputIdle(ProcessInfo.hProcess, INFINITE) = 0 then
        Result := ProcessInfo.hProcess;
    end;
end;
Den Fenstertext lasse ich mir mit einer von den 2 nachfolgenden Proceduren ausgeben:

#1:
Delphi-Quellcode:
function WindowText(const WHandle: THandle): String;
var
  length: LongInt;
  Title : String;

begin
  Result := '';

  If WHandle <= 0 then
    exit;

  length := GetWindowTextLength(WHandle) + 1;
  SetLength(Title, length);

  GetWindowText(WHandle, PChar(Title), length);
  Result := TrimRight(Title);
end;
#2:
Delphi-Quellcode:
function WindowText(Wnd: HWND): String;

  function EnumWindowsProc(wHandle: HWND; StringList: TStringList): Bool; stdcall;
  var
     Title: array[0..255] of Char;
  begin
    Result := true;

    GetWindowText(wHandle, Title, length(Title));

    If IsWindowVisible(wHandle) then
      StringList.AddObject(String(Title), TObject(wHandle));
  end;

var
  i : Integer;
  Window_HND: HWND;
  StringList: TStringList;

begin
  Result := '';

  If Wnd = 0 then
    exit;

  StringList := TStringList.Create;

  try
    EnumWindows(@EnumWindowsProc, Integer(StringList));

    for i := 0 to Pred(StringList.Count) do
      begin
        Window_HND := HWND(StringList.Objects[i]);

        If Window_HND = Wnd then
          begin
            Result := StringList.Strings[i];

            break;
          end;
      end;
  finally
    FreeAndNil(StringList);
  end;
end;
Ich lade insgesamt 2 Programme, speichere mir jeweils die Handles und lasse mir dann den Fenstertext ausgeben.

Bei dem 1. Programm, das nur die Haupt-Form besitzt (beide Programme sind von mir), wird von beiden Proceduren der richtige Text ausgegeben.
Beim 2. Programm, dass neben der Haupt-Form noch eine 2. Form besitzt, bekomm ich bei der 1. Procedure den Fenstertext der 2. Form (nicht den der Hauptform) und bei der 2. Procedure nur den leeren Rückgabewert der Procedure selbst (also nichts).

Wie kann ich sauber den (richtigen) Fenstertext auslesen?

[edit]
warum bei der 2. Procedure nichts rückgemeldet wird, hab ich jetzt rausgefunden:

blende ich diese If-Abfrage aus:
Delphi-Quellcode:
// If IsWindowVisible(wHandle) then
      StringList.AddObject(String(Title), TObject(wHandle));
so erhalte ich das gleiche, wie bei der 1. Procedure - nämlich den Text der 2. Form
mfg
Helmi

>> Theorie ist Wissen, dass nicht funktioniert - Praxis ist, wenn alles funktioniert und keiner weiss warum! <<

Geändert von Helmi ( 5. Jan 2015 um 18:38 Uhr)
  Mit Zitat antworten Zitat