Registriert seit: 18. Aug 2004
Ort: Edewecht
712 Beiträge
Delphi 5 Professional
|
Re: fremde Anwendung starten und Position vorschreiben
24. Feb 2005, 12:18
Wenn du das Programm mit CreateProcess startest, kannst du in TStartupInfo auch die Position mit angeben. Das klappt aber nicht bei jedem Programm. Andere Möglichkeit wäre, das Programm zu starten. Warten bis das Fenster erzeugt worden ist. Gültiges Fensterhandle mit EnumWindows & GetWindowThreadProcessId suchen und mit MoveWindow verschieben.
Delphi-Quellcode:
procedure RunApp(const FileName: String; Left, Top, Width, Height: Integer);
function EnumWindowsProc(hWnd: HWND; lParam: LPARAM): BOOL; stdcall;
begin
TList(lParam).Add(Pointer(hWnd));
Result := True;
end;
function GetWndHandle(ProcessId: DWORD): HWND;
var
List: TList;
I: Integer;
PID: DWORD;
begin
Result := 0;
List := TList.Create;
try
EnumWindows(@EnumWindowsProc, LPARAM(List));
for I := 0 to List.Count - 1 do
if GetWindowThreadProcessId(HWND(List.Items[I]), @PID) <> 0 then
if PID = ProcessId then
begin
Result := HWND(List.Items[I]);
Break;
end;
finally
List.Free;
end;
end;
var
SI: TStartupInfo;
PI: TProcessInformation;
AppHWnd: HWND;
begin
FillChar(SI, SizeOf(TStartupInfo), 0);
SI.cb := SizeOf(TStartupInfo);
if CreateProcess(nil, PChar(FileName), nil, nil, False, 0, nil, nil, SI, PI) then
begin
WaitForInputIdle(PI.hProcess, INFINITE);
AppHWnd := GetWndHandle(PI.dwProcessId);
if IsWindow(AppHWnd) then
MoveWindow(AppHWnd, Left, Top, Width, Height, True);
CloseHandle(PI.hProcess);
CloseHandle(PI.hThread);
end;
end;
Ciao, Sprint.
"I don't know what I am doing, but I am sure I am having fun!"
|
|
Zitat
|