![]() |
mit createProcess ein Prog starten ohne Focus zu verlieren
Hallo,
ich kann ja mit createProcess ein anderes Programm aus meiner Anwendung heraus starten. Dabei verliert meine Anwendung aber den Focus. Alle Versuche, meine Anwendung nach Start des anderen Programms wieder nach vorne zu bringen, sind bisher gescheitert. Ich habe es mit verschiedenen Beispielen hier aus diesem Forum probiert. Gibt es eine Möglichkeit, mit createProcess ein anderes Programm zu starten ohne den Focus zu verlieren bzw. ihn danach zurückzubekommen? Gruß Gambit |
Re: mit createProcess ein Prog starten ohne Focus zu verlier
Der Focus wird von Windows entrissen. Da gibt es wohl keine Moeglichkeit das zu verhindern.
Mit CreateProcess das Programm starten und mit WaitForInputIdle warten bis das Programm voellig gestartet ist. Dann muesste es moeglich sein den Focus zurueckzuerobern. |
Re: mit createProcess ein Prog starten ohne Focus zu verlier
OK WaitForInputIdle rufe ich jetzt nach Aufruf des fremden Programms auf. Das fremde Programm starte ich im OnCreate Ereignis meiner Anwendung.
Habe versucht mit folgender Routine von SPRINT den Focus zurückzubekommen:
Delphi-Quellcode:
wobei ich als Handle "self.handle" eingebe. Das führe ich jetzt im OnActivate Ereignis meiner Anwendung aus. Funzt aber nicht und ich verstehe nicht warum.
procedure TForm1.ForceSetForegroundWindow(AHandle: HWND);
var AppHWnd: HWND; AppThreadId: DWORD; ThisThreadId: DWORD; TimeOut: DWORD; begin if GetForegroundWindow <> AHandle then begin BringWindowToTop(AHandle); SetForegroundWindow(AHandle); AppHWnd := GetForegroundWindow; if AppHWnd <> AHandle then begin AppThreadId := GetWindowThreadProcessId(AppHWnd, nil); ThisThreadId := GetCurrentThreadId; if (AppThreadId <> 0) and (ThisThreadId <> 0) then begin if AttachThreadInput(ThisThreadId, AppThreadId, True) then begin BringWindowToTop(AHandle); SetForegroundWindow(AHandle); AttachThreadInput(ThisThreadId, AppThreadId, False); end; if GetForegroundWindow <> AHandle then begin SystemParametersInfo(SPI_GETFOREGROUNDLOCKTIMEOUT, 0, @TimeOut, 0); SystemParametersInfo(SPI_SETFOREGROUNDLOCKTIMEOUT, 0, TObject(0), SPIF_SENDCHANGE); BringWindowToTop(AHandle); SetForegroundWindow(AHandle); SystemParametersInfo(SPI_SETFOREGROUNDLOCKTIMEOUT, 0, TObject(TimeOut), SPIF_SENDCHANGE); end; end; end; end; end; |
Re: mit createProcess ein Prog starten ohne Focus zu verlier
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var SI: TStartupInfo; PI: TProcessInformation; begin FillChar(SI, SizeOf(TStartupInfo), 0); with SI do begin cb := SizeOf(TStartupInfo); dwFlags := STARTF_USESHOWWINDOW; wShowWindow := SW_SHOWNOACTIVATE; end; if CreateProcess(nil, 'NOTEPAD.EXE', nil, nil, False, 0, nil, nil, SI, PI) then begin WaitForInputIdle(PI.hProcess, INFINITE); BringWindowToTop(Self.Handle); CloseHandle(PI.hProcess); CloseHandle(PI.hThread); end; end; |
Re: mit createProcess ein Prog starten ohne Focus zu verlier
ne, klappt auch irgendwie nicht...
EDIT in deinem Beispiel hier wohl aber bei meinem(was du ja kennst mit STunnel) gehts nicht, der einzige Unterschied ist bei mir, dass ich jetzt nicht self.handle angegeben habe sondern Form1.Handle weil bei mir die Routinen in ner eigenen Klasse stehen... //EDIT |
Re: mit createProcess ein Prog starten ohne Focus zu verlier
Starte stunnel versteckt. Oder musst das Fenster auf sein?
|
Re: mit createProcess ein Prog starten ohne Focus zu verlier
nein nur das Icon im Tray sollte zu sehen sein. Meinst du mit SW_Hide starten? Hatte ich auch schon probiert...
edit ich hatte schon aus lauter Verzweiflung daran gedacht noch ein Miniprogramm zu schreiben, welches ich versteckt nach STunnel starte und welches den Focus an meine Hauptapplikation zurückgibt aber das wäre ja von hinten durch die Brust ins Auge... //edit |
Re: mit createProcess ein Prog starten ohne Focus zu verlier
Sonst versuche mal Application.Handle, anstat Self.Handle. Ja, SW_HIDE meinte ich.
|
Re: mit createProcess ein Prog starten ohne Focus zu verlier
das Handle stimmt schon glaube ich, hatte ich mal mit FindWindow überprüft...
|
Re: mit createProcess ein Prog starten ohne Focus zu verlier
Im OnCreate ein anderes Programm zu starten ist Unsinn.
Da ist die Mainform noch garnicht angezeigt/existent und das Programm kann den Focus doch noch garnicht haben. Mach es im OnShow und schuetze es dort vor Mehrfachaufruf. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:43 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