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