So wenn man die Funktion ReadToplevelPrograms so umbaut:
Delphi-Quellcode:
Function TRunningPrograms.ReadToplevelPrograms: Boolean;
Type
PMyEnumParam = ^TMyEnumParam;
TMyEnumParam = Record
Handles: TStringlist;
Captions: TStringlist;
End;
Var
ndx: Integer;
Handlelist,
Captionlist: TStringlist;
Params: TMyEnumParam;
function GetWindows(const hWnd : THandle; Param: PMyEnumParam): LongBool; stdcall;
var
cLen: Longint;
strCaption: String;
begin
Result := True;
if (IsWindowVisible(hWnd)) and
((GetWindowLong(hWnd, GWL_HWndPARENT) = 0) or
(GetWindowLong(hWnd, GWL_HWndPARENT) = GetDesktopWindow)) and
(GetWindowLong(hWnd, GWL_EXSTYLE) and WS_EX_TOOLWINDOW = 0) then
begin
cLen := SendMessage(hWnd, WM_GETTEXTLENGTH, 0, 0);
if cLen > 0 then
begin
SetLength(strCaption, cLen);
SendMessage(hWnd, WM_GETTEXT, cLen + 1, Longint(Pchar(strCaption)));
Param.Handles.Add(IntToStr(hWnd));
Param.Captions.Add(strCaption);
end;
end;
// mit Result = False kann die Callbackfunktion vorzeitig verlassen werden
end;
Begin
If Assigned(oPrograms) then
begin
Params.Handles := TStringList.Create;
Params.Captions := TStringList.Create;
EnumWindows(@GetWindows, LPARAM(@Params));
for ndx := 0 to Params.Handles.Count - 1 do
begin
AddProgram(StrToInt(Params.Handles.Strings[ndx]), Params.Captions.Strings[ndx]);
end;
Params.Handles.Free;
Params.Captions.Free;
Result := True;
end else
Result := False;
End;
Dann funktioniert das auch mit dem AddProgram. Danke an alle die mir Antworten gegeben haben, ich programmier jetzt mal weiter.
Cu!