Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi mit createProcess ein Prog starten ohne Focus zu verlieren (https://www.delphipraxis.net/40400-mit-createprocess-ein-prog-starten-ohne-focus-zu-verlieren.html)

Gambit 15. Feb 2005 09:46


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

Robert Marquardt 15. Feb 2005 09:55

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.

Gambit 15. Feb 2005 10:17

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:
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;
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.

Sprint 15. Feb 2005 10:24

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;

Gambit 15. Feb 2005 10:38

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

Sprint 15. Feb 2005 10:44

Re: mit createProcess ein Prog starten ohne Focus zu verlier
 
Starte stunnel versteckt. Oder musst das Fenster auf sein?

Gambit 15. Feb 2005 10:47

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

Sprint 15. Feb 2005 10:56

Re: mit createProcess ein Prog starten ohne Focus zu verlier
 
Sonst versuche mal Application.Handle, anstat Self.Handle. Ja, SW_HIDE meinte ich.

Gambit 15. Feb 2005 10:59

Re: mit createProcess ein Prog starten ohne Focus zu verlier
 
das Handle stimmt schon glaube ich, hatte ich mal mit FindWindow überprüft...

Robert Marquardt 15. Feb 2005 12:37

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.

Gambit 15. Feb 2005 12:57

Re: mit createProcess ein Prog starten ohne Focus zu verlier
 
Hab ich versucht, es bringt mich aber auch nicht weiter, ich bekomm trotzdem den Focus nicht zurück. Ich hatte es deshalb im OnCreate Ereignis gestartet damit ich mir in meiner Splash-Form anzeigen kann, dass versucht wird sTunnel zu starten...

Sprint 15. Feb 2005 13:25

Re: mit createProcess ein Prog starten ohne Focus zu verlier
 
Ich verstehe nicht, wo dein Problem liegt. Habe es mal ausprobiert. STunnel mit CreateProcess gestartet. Fokus ist weg. Wenn ich aber ForceSetForegroundWindow(Application.Handle) nach WaitForInputIdle ausführe, habe ich den Fokus wieder.

Gambit 15. Feb 2005 13:43

Re: mit createProcess ein Prog starten ohne Focus zu verlier
 
Und das sollte bei dir auch funktionieren, wenn du sTunnel im onCreate Ereignis deiner Form startest, da verstehe ich Robert nicht so ganz weil ich für den Start von Stunnel doch erstmal noch keinen Focus benötige. Ich will den ja erst später bekommen. Kannst du das mal versuchen, Sprint?

Gambit 15. Feb 2005 13:55

Re: mit createProcess ein Prog starten ohne Focus zu verlier
 
Habe gerade mal eine neue Applikation erstellt und da funzt es auch, auch wenn ich STunnel im OnCreate Ereignis starte. Nur bei meiner anderen Applikation nicht. Da möcht ich wissen, wo da der Teufel im Detail steckt...


Edit:
Ha, da brauch ich gar nix zu machen, das neue Programm behält seinen Focus sogar so. Dat gibbet doch gar nicht...

Sprint 15. Feb 2005 14:36

Re: mit createProcess ein Prog starten ohne Focus zu verlier
 
Ich habe es nicht im OnCreate Ereignis ausprobiert. Da ich dieses Ereignis nur benutze, wenn ich etwas visuelles für meine Form erstellen muss. Alles andere mache ich mit einer Variable (FirstRun) vom Typ Boolean im OnActivate Ereignis.

Gambit 15. Feb 2005 15:10

Re: mit createProcess ein Prog starten ohne Focus zu verlier
 
Naja aber ich. Also wenn man sTunnel im OnCreate Ereignis startet, behält das Hauptprogramm sowieso den Focus, man braucht sich also nicht drum zu kümmern. Nur bei meiner Applikation funzt das nicht, ich nehme an, dass das irgendwas mit dem Splash-Screen zu tun hat. Aber was, da werde ich wohl nicht so schnell hinterkommen...

Lege ich mir einen Button auf die Hauptform und benutze ForceSetForegroundWindow(Application.Handle) beim Start von sTunnel, bekomme ich den Focus auch zurück(onhne orceSetForegroundWindow nat. nicht). Sobald ichs aber in OnCreate, OnActivate oder OnShow einbaue gehts nicht mehr. Kann es sein, dass ich in dem Moment noch das Handle von der Splash-Form benutze? Muss ich mal ausprobieren...


Alle Zeitangaben in WEZ +1. Es ist jetzt 08: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