AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi Delphi Probleme beim Auslesen von Festertext
Thema durchsuchen
Ansicht
Themen-Optionen

Probleme beim Auslesen von Festertext

Ein Thema von Helmi · begonnen am 5. Jan 2015 · letzter Beitrag vom 5. Jan 2015
Antwort Antwort
Benutzerbild von Helmi
Helmi

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

Probleme beim Auslesen von Festertext

  Alt 5. Jan 2015, 17: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 17:38 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.142 Beiträge
 
Delphi 12 Athens
 
#2

AW: Probleme beim Auslesen von Festertext

  Alt 5. Jan 2015, 17:42
Wie jetzt, du lässt dir die Prozess-ID als THandle gecastet liefern und benutzt dann das THandle (HANDLE) als Fenster-Handle (HWND) und willst darüber einen Text auslesen?
Na das muß ja schief gehn.

Du hast das Prozess-Handle die Prozess-ID.
Nun kannst du via EnumWindows alle Top-Level-Fenster durchlaufen und merkst dir die Fenster, deren "Prozess-ID" (nicht das Fenster-Handle) der Prozess-ID des Programmstarts entspricht.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu ( 5. Jan 2015 um 17:45 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.541 Beiträge
 
Delphi 11 Alexandria
 
#3

AW: Probleme beim Auslesen von Festertext

  Alt 5. Jan 2015, 17:45
Der Sinn der 2. Prozedur ist mir nicht klar, wieso erst über alle Fenster iterieren und dann mit dem gespeicherten Handle vergleichen? Wenn schon, dann würde ich doch eher EnumThreadWindows nutzen, die ThreadId sollte ja in der befüllten ProcessInformation enthalten sein. Zum eigentlichen Problem: bist Du sicher, dass Du Dir auch die richtigen Fensterhandles merkst?
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Benutzerbild von Helmi
Helmi

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

AW: Probleme beim Auslesen von Festertext

  Alt 5. Jan 2015, 17:50
ich weiss leider nicht mehr, woher ich die 2. Procedure her habe.
die 1. Procedure hab ich hieraus gebastelt.

ganz sicher bin ich nicht, ob ich das richtige Handle hab.

Wie müsste das richtigerweise aussehen?

[edit]

Uups - ich hab was übersehen:
das Handle, dass ich mir speichere wandel ich erst noch um:
Delphi-Quellcode:
function PHandle_to_WHandle(const PHandle: Cardinal): HWND;

  function EnumWindowsProc(hWnd: HWND; lParam: LPARAM): BOOL; stdcall;
   begin
     TList(lParam).Add(Pointer(hWnd));
     Result := True;
   end;

var
   i : Integer;
   List : TList;
   ProcessId: DWORD;

begin
  Result := 0;

  If PHandle <= 0 then
    exit;

  List := TList.Create;

  try
    If EnumWindows(@EnumWindowsProc, Integer(List)) then
      for i := 0 to Pred(List.Count) do
        begin
          If GetWindowThreadProcessId(Integer(List.Items[i]), ProcessId) > 0 then
            If GetProcessId(PHandle) = ProcessId then
              begin
                Result := HWND(List.Items[i]);

                break;
              end;
        end;
  finally
    FreeAndNil(List);
  end;
end;
Und erst mit dem Handle geh ich auf die anderen 2 Proceduren
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 17:55 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.541 Beiträge
 
Delphi 11 Alexandria
 
#5

AW: Probleme beim Auslesen von Festertext

  Alt 5. Jan 2015, 18:17
Ob das so nun 100%-ig richtig ist, weiß ich nicht, aber versuch es doch mal so:
Delphi-Quellcode:
function start_process(const FileName: String): DWORD;
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_SHOW;

  If CreateProcess(nil, PChar(FileName + #0), nil, nil, false, 0, nil, nil,
                    StartupInfo, ProcessInfo) then
    try
      If WaitForInputIdle(ProcessInfo.hProcess, INFINITE) = 0 then
        Result := ProcessInfo.dwThreadId;
    finally
      CloseHandle(ProcessInfo.hProcess);
      CloseHandle(ProcessInfo.hThread);
    end;
end;

function EnumThreadWndProc(Wnd: HWnd; Param: lParam): BOOL; stdcall;
var
  Len: integer;
  Title: string;
begin
  Result := true;
  if IsWindowVisible(Wnd) then
    begin
      Len := GetWindowTextLength(Wnd) + 1;
      SetLength(Title, Len);
      GetWindowText(Wnd, PChar(Title), Len);
      SetLength(Title, StrLen(PChar(Title)));
      TStringList(Param).Add(Title);
    end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  ThreadId: DWORD;
  List: TStringlist;
  i: integer;
begin
  ThreadId := start_process('C:\Windows\notepad.exe');
  if ThreadId <> 0 then
    begin
      List := TStringList.Create;
      try
        EnumThreadWindows(ThreadId, @EnumThreadWndProc, lParam(List));
        for i := 0 to List.Count - 1 do
          ShowMessage(List[i]);
      finally
        List.Free;
      end;
    end;
end;
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Benutzerbild von Helmi
Helmi

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

AW: Probleme beim Auslesen von Festertext

  Alt 5. Jan 2015, 18:40
Danke Papa, äh DeddyH

schaut schon sehr vielversprechend aus

Ich hab das mal in einer Testanwendung mit meinen zwei Programmen ausprobiert
und ich hab jeweils die richtigen Texte zurückbekommen
mfg
Helmi

>> Theorie ist Wissen, dass nicht funktioniert - Praxis ist, wenn alles funktioniert und keiner weiss warum! <<
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#7

AW: Probleme beim Auslesen von Festertext

  Alt 5. Jan 2015, 19:01
beide Programme sind von mir
Und warum baust du dann nicht eine gescheite Kommunikation zwischen deinen Programmen ein und wurschtelst stattdessen mit Fensterhandels und Text auslesen rum? Siehst ja selbst, dass das nicht richtig funktioniert.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von Helmi
Helmi

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

AW: Probleme beim Auslesen von Festertext

  Alt 5. Jan 2015, 19:02
es sind nur Testprogramme, können aber auch Nicht-von-mir-Programme sein
mfg
Helmi

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


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:05 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