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 CreateProcess nimmt Fokus weg (https://www.delphipraxis.net/146525-createprocess-nimmt-fokus-weg.html)

Shark99 21. Jan 2010 17:57


CreateProcess nimmt Fokus weg
 
Hi!

ich versuche mit CreateProcess einen neuen Tab in Firefox zu öffnen.

Firefox befindet sich schon im Speicher.

Ich habe dabei das Problem dass meine Anwendung den Fokus verliert, dieser landet aber nicht etwa bei Firefox.

Zuerst habe ich Firefox so konfiguriert dass es neue Tabs im Hintergrund starten soll:

about:config

dann loadDivertedInBackground auf true gesetzt und neu gestartet.

Dann führe ich CreateProcess mit folgenden Code aus:

Delphi-Quellcode:
var

  FStartupInfo: TStartupInfo;
  FProcessInfo: TProcessInformation;

...

  FillChar(FStartupInfo, SizeOf(FStartupInfo), 0);
  FStartupInfo.CB := SizeOf(FStartupInfo);
  FStartupInfo.dwFlags := STARTF_USESHOWWINDOW or STARTF_FORCEONFEEDBACK;
  FStartupInfo.wShowWindow := SW_SHOWNOACTIVATE;

  CreateProcess(nil,
                  'c:\program files\mozilla firefox\firefox.exe -new-tab http://www.google.de',
                  nil,
                  nil,
                  FALSE,
                  NORMAL_PRIORITY_CLASS,
                  nil,
                  nil,
                  FStartupInfo,
                  FProcessInfo);
Der neue Tab wird geöffnet, Firefox bleibt wie gewünscht in Hintergrund, d.h. das Firefox Fenster kommt nicht nach vorne und wird auch nicht aktiviert.

Meine Anwendung verliert aber trotzdem den Fokus!

Um zu überprüfen wohin der Focus geht schauete ich nach CreateProcess mit GetForeGroundWindow() und GetWindowText() mir an was los ist.

GetForeGroundWindow liefert mir ein Handle. GetWindowText zeigt aber das dieses Fenster keinen Titel hat (kommt ein leerer String zurück).

Wenn ich mit Microsoft Spy++ nach diesem Handle suche, wird es nicht gefunden.

Es ist ziemlich mysteriös. Ich hoffe jemand weiß eine Lösung.

Danke im Voraus!

himitsu 21. Jan 2010 18:21

Re: CreateProcess nimmt Fokus weg
 
Du startest eine NEUE Firefox-Instanz,
wodurch natürlich dein Programm den Eingabefokus verliert (ist ja nun beim neuen FF)
dieser FF-Instanz wurde aber gesagt, sie soll den neuen Tab in einer bereits existierenden FF-Instanz öffnen und sich dann wieder beenden.

Lösung: nachdem dem du den FF gestartet hast, gibts DU deinem Programm den Eingabefokus.

Shark99 21. Jan 2010 18:29

Re: CreateProcess nimmt Fokus weg
 
Diesen Hack hab ich zuvor versucht. Er hat aber leider zwei böse Nebeneffekte.

1. Ist man zu der Zeit als CreateProcess() passiert dabei einen Text (z.B. in einem Texteditor) zu schreiben, dann kann es passieren (nicht immer, aber mehrmals gehabt) dass ein Buchstabe dabei verlorengeht.

2. Launche ich mehrere URLs nacheinander und der User will in der Zwischenzeit (so lange die Webseiten laden) was anderen machen, wechselt er mitten drin den Fokus z.B. zum Windows Explorer. Wenn es mitten im CreateProcess passiert (unwahrscheinlich, aber möglich), setze ich den Fokus falsch zurück, auf das Fenster welches vor dem Explorer aktiv war.

--

Nach etwas mehr Debuggen sehe ich dass der Focus zu einem versteckten Fenstern mit der Klasse FirefoxMessageWindow wandert.

p.s.

Wenn Firefox noch nicht im Speicher ist, nimmt es sich immer den Focus, trotz loadDivertedInBackground = True und vor allem trotz SW_SHOWNOACTIVATE. Nach viel testen muss ich feststellen dass Firefox die einzige Anwendung ist welche alle SW_ Optionen komplett ignoriert. Hab 5 andere Programme (u.a. Notepad) mit SW_SHOWNOACTIVATE gestartet und sie nehmen keinen Focus an sich.

Shark99 21. Jan 2010 18:53

Re: CreateProcess nimmt Fokus weg
 
Um genauer zu erklären wieso SetForeGroundWindow() hier nicht zuverlässig funktioniert. FirefoxMessageWindow schnappt sich den Fokus nicht sofort nach CreateProcess(), sondern etwas später. Ich muss deshalb Polling betreiben um zu schauen wann das passiert und den Fokus rücksetzen. Das passiert aber mit einer minimalen Verzögerung, wodurch z.B. beim Tippen von Text ein Buchstab verloren gehen kann.

Shark99 21. Jan 2010 21:53

Re: CreateProcess nimmt Fokus weg
 
Nach zwei Stunden mehr googlen stellt sich heraus dass dieses Problem auftritt, wenn man Programme startet die ein verstecktes Message Fenster haben. Sie ignorieren dann alle SW_ switches von CreateProcess() oder ShellExecute(). Eine Lösung hab ich jedoch nicht gefunden.

Shark99 21. Jan 2010 22:16

Re: CreateProcess nimmt Fokus weg
 
LockSetForegroundWindow() hilft leider auch nicht.

Shark99 21. Jan 2010 23:49

Re: CreateProcess nimmt Fokus weg
 
Neuer Versuch:

Delphi-Quellcode:
  WndBefore := GetForeGroundWindow;

  if CreateProcess(nil,
                  PChar('c:\program files\mozilla firefox\firefox.exe -new-tab http://www.google.de'),
                  nil,
                  nil,
                  FALSE,
                  NORMAL_PRIORITY_CLASS,
                  nil,
                  nil,
                  FStartupInfo,
                  FProcessInfo) then
  begin
      WaitforSingleObject(FProcessInfo.hProcess,6000);
  end;

  WndAfter := GetForeGroundWindow;

  if (WndAfter <> WndBefore) and (WndBefore <> 0) then
  begin
        BringWindowToTop(WndBefore);
        SetForegroundWindow(WndBefore);
  end;
Ergebnis:

Eine Meldung von Firefox dass es nicht mehr reagiert und neu gestartet werden muss.

Ohne den "if WndAfter <> WndBefore" Block startet es zwar problemlos, aber wie schon gesagt der Input Focus geht an ein unsichtbares Firefox Message Fenster, also ins Nirvana.

SnergleTheDwarf 22. Jan 2010 09:37

Re: CreateProcess nimmt Fokus weg
 
schonmal statt:

FStartupInfo.wShowWindow := SW_SHOWNOACTIVATE;

lieber

FStartupInfo.wShowWindow := SW_HIDE; oder FStartupInfo.wShowWindow := SW_SHOWNA;

(siehe: http://msdn.microsoft.com/en-us/libr...8VS.85%29.aspx)

probiert ?

Shark99 22. Jan 2010 18:09

Re: CreateProcess nimmt Fokus weg
 
Ja, habe alle 12 SW_ Optionen versucht. Wenn eine Anwendung das Messaging über ein unsichtbares Fenster macht (wie Firefox) werden alle SW_ Direktiven ignoriert.


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