Delphi-PRAXiS
Seite 1 von 2  1 2      

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.


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:46 Uhr.
Seite 1 von 2  1 2      

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