![]() |
fremde Anwendung starten und Position vorschreiben
Hallo Delphianer,
habe folgendes Problem: Ich möchte von meiner Anwendung aus ein anderes autarkes Programm starten und auch beenden. Dies klappt soweit alles wunderbar, aber..... Wie stelle ich es an, dass ich dieser Anwendung eine Position auf dem Deskop vorschreiben kann? (ich meine nicht "Show_normal" usw.) Der Programmierer der Anwendung hat es woll auf Screen- oder Desktopcenter gesetzt. Da ich von diesem Programm keinen Quellcode besitze, kann ich daran auch nichts ändern. Gibt es überhaupt eine Möglichkeit einem fremden Programm die Position vorzuschreiben? Danke im Voraus Padavan |
Re: fremde Anwendung starten und Position vorschreiben
Zitat:
Du brauchts lediglich das Handle des Fensters. Schau mal in die OH zu Setwindowpos
Delphi-Quellcode:
MfG GM
BOOL SetWindowPos(
HWND hWnd, // handle of window HWND hWndInsertAfter, // placement-order handle int X, // horizontal position int Y, // vertical position int cx, // width int cy, // height UINT uFlags // window-positioning flags ); |
Re: fremde Anwendung starten und Position vorschreiben
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; |
Re: fremde Anwendung starten und Position vorschreiben
Hallo Sprint, hallo gmarts,
habe mal deinen Vorschlag in die Tat umsetzen wollen, weil bei gmarts´s Vorschlag vorausgesetzt wurde das man weiß wie man an das Handle kommt. Leider bin ich noch nicht so fit im Programmieren, sodass mir das so vorkam, als hättest du dieses in deinem Programmrumpf bereits umgesetzt. Diesen habe ich in mein Programm mit eingebunden und den entsprechenden Pfadnamen mit eingetragen. Die Zeile
Delphi-Quellcode:
habe ich durch
procedure RunApp(const FileName: String; Left, Top, Width, Height: Integer);
Delphi-Quellcode:
ersetzt, um sie leichter aufrufen zu können. Wiegesagt, mir fehlen noch einige Kenntnisse.
procedure RunApp;
Soweit funktioniert dein Programmteil auch, allerdings setzt er mein Hauptanwendung gleich mit auf die entsprechende Bildschirmposition, welche eigentlich für die von mir gestartete bestimmt war. :gruebel: |
Re: fremde Anwendung starten und Position vorschreiben
Handle finden z.B: mit diesem Tool:
![]() Das generiert dir auch den Code: Hier am Beispiel von Wordpad.
Delphi-Quellcode:
var
wnd: HWND; begin wnd := FindWindow('WordPadClass', nil); if wnd <> 0 then begin setwindowpos(bla bla bla..siehe oh); end; end; |
Re: fremde Anwendung starten und Position vorschreiben
Vielen Dank,
so verstehe ich das auch. :witch: |
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:18 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz