Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Fremdanwendung starten und neben Programm positionieren (https://www.delphipraxis.net/133787-fremdanwendung-starten-und-neben-programm-positionieren.html)

mschaefer 8. Mai 2009 16:30


Fremdanwendung starten und neben Programm positionieren
 
Ja wie kann ich eine Fremdanwendung (notepad.exe) starten und direkt neben meiner mit der selben Höhe und Breite positionieren. Bei Shellexecute habe ich ja nicht das Handle der Fremdanwendung. Gibt es da eine Aufrufmöglichkeit, die das Handle liefert?

Grüße // Martin

Apollonius 8. Mai 2009 16:35

Re: Fremdanwendung starten und neben Programm positionieren
 
Zum Positionieren brauchst du ein Fensterhandle, kein Prozesshandle. Am besten startest du den Prozess mit CreateProcess (da erhältst du das Handle des ersten Threads), wartest mit WaitForInputIdle darauf, dass die Initialisierung abgeschlossen ist und holst dir dann mit EnumThreadWindows alle Top-Level-Fenster des ersten Threads. Dabei solltest du lediglich ein Fenster finden, welches du dann neu positionieren kannst.

mschaefer 8. Mai 2009 17:19

Re: Fremdanwendung starten und neben Programm positionieren
 
Zitat:

Am besten startest du den Prozess mit CreateProcess
Na gut erstmal wieder CreateProcess anschauen . . .

Delphi-Quellcode:
function ExecNewProcess
(         ProgramName : String;
          Wait        : Boolean
   var   LProcInfo   : Dword) : Dword;
var
    StartInfo : TStartupInfo;
    ProcInfo : TProcessInformation;
    CreateOK : Boolean;
begin
    FillChar(StartInfo,SizeOf(TStartupInfo),#0);
    FillChar(ProcInfo,SizeOf(TProcessInformation),#0);
    StartInfo.cb := SizeOf(TStartupInfo);
    CreateOK := CreateProcess(nil, PChar(ProgramName), nil, nil,False,
              CREATE_NEW_PROCESS_GROUP+NORMAL_PRIORITY_CLASS,
              nil, nil, StartInfo, ProcInfo);
    { na wirklich gestartet ? } 
    if CreateOK then
    begin
        //may or may not be needed. Usually wait for child processes
       if Wait then WaitForSingleObject(ProcInfo.hProcess, INFINITE);
    end
    else
    begin
         ShowMessage('Läuft nicht: '+ProgramName);
     end;
     CloseHandle(ProcInfo.hProcess);
     CloseHandle(ProcInfo.hThread);

     LProcInfo := ProcInfo.hProcess;
     GetExitCodeProcess(ProcInfo.hProcess, Result ) {ProcInfo ist ErrorCode};
     
end;
Version 2: Ohne das 'ProcessMessage' gehts dann auch und jetzt habe ich die ProcessId....

Grüße

Apollonius 8. Mai 2009 17:24

Re: Fremdanwendung starten und neben Programm positionieren
 
Zitat:

Delphi-Quellcode:
CloseHandle(ProcInfo.hProcess);
CloseHandle(ProcInfo.hThread);

Wo liegt der Fehler? :mrgreen: Dein ProcessMessage scheint mir übrigens unklug zu sein. WM_QUIT-Nachrichten solltest du als Aufforderung zum Abbrechen verstehen.

mschaefer 8. Mai 2009 19:26

Re: Fremdanwendung starten und neben Programm positionieren
 
EnumThreadWindows oder EnumWindows das ist die Frage ... // Martin

Apollonius 8. Mai 2009 19:34

Re: Fremdanwendung starten und neben Programm positionieren
 
Ich würde eher EnumThreadWindows statt EnumWindows nehmen. Dann erhältst du auch nur die Fenster von Notepad. Die Position kannst du recht einfach mit SetWindowPos in deiner Callback-Funktion setzen.

mschaefer 8. Mai 2009 20:43

Re: Fremdanwendung starten und neben Programm positionieren
 
Naja so im Groben... // Grüße

mschaefer 9. Mai 2009 23:59

Re: Fremdanwendung starten und neben Programm positionieren
 
Das mit EnumThreadWindows war wohl keine ausgetestete Idee.

Denn die EnumThreadWindows Callbackfunktion bietet keine Möglichkeit eine Liste zu übergeben. Und bei der Datenübergabe aus der Funktion zum Beispiel in eine Listbox kommt es zu einer Zugriffsverletzung.
Mit EnumWindows kann man als Funktionsrückgabewert eine Liste bekommen. Weiterhin scheint nur das Shell-Try-Wind vor dem gesuchten Programm zu liegen, was dann als zweites in der Liste zu finden ist.

Grüße // Martin

Apollonius 10. Mai 2009 10:18

Re: Fremdanwendung starten und neben Programm positionieren
 
Hm? Der Callback für EnumThreadWindows sieht doch exakt so aus wie jener für EnumWindows. Also kannst du durch den LParam auch eine Liste übergeben.


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:28 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz