Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi fremde Anwendung starten und Position vorschreiben (https://www.delphipraxis.net/40997-fremde-anwendung-starten-und-position-vorschreiben.html)

padavan 24. Feb 2005 10:32


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

gmarts 24. Feb 2005 10:50

Re: fremde Anwendung starten und Position vorschreiben
 
Zitat:

Zitat von padavan
Gibt es überhaupt eine Möglichkeit einem fremden Programm die Position vorzuschreiben?

Klar!
Du brauchts lediglich das Handle des Fensters.
Schau mal in die OH zu Setwindowpos

Delphi-Quellcode:
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
   );
MfG GM

Sprint 24. Feb 2005 11:18

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;

padavan 24. Feb 2005 12:18

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:
procedure RunApp(const FileName: String; Left, Top, Width, Height: Integer);
habe ich durch
Delphi-Quellcode:
procedure RunApp;
ersetzt, um sie leichter aufrufen zu können. Wiegesagt, mir fehlen noch einige Kenntnisse.
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:

gmarts 24. Feb 2005 13:18

Re: fremde Anwendung starten und Position vorschreiben
 
Handle finden z.B: mit diesem Tool:
X-Spy


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;

padavan 24. Feb 2005 13:39

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