![]() |
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 |
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.
|
Re: Fremdanwendung starten und neben Programm positionieren
Zitat:
Delphi-Quellcode:
Version 2: Ohne das 'ProcessMessage' gehts dann auch und jetzt habe ich die ProcessId....
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; Grüße |
Re: Fremdanwendung starten und neben Programm positionieren
Zitat:
|
Re: Fremdanwendung starten und neben Programm positionieren
EnumThreadWindows oder EnumWindows das ist die Frage ... // Martin
|
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.
|
Re: Fremdanwendung starten und neben Programm positionieren
Naja so im Groben... // Grüße
|
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 |
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 01:11 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