AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

CreateProcess nimmt Fokus weg

Ein Thema von Shark99 · begonnen am 21. Jan 2010 · letzter Beitrag vom 22. Jan 2010
Antwort Antwort
Shark99

Registriert seit: 16. Mai 2007
403 Beiträge
 
#1

CreateProcess nimmt Fokus weg

  Alt 21. Jan 2010, 18:57
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!
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
38.731 Beiträge
 
Delphi 10.4 Sydney
 
#2

Re: CreateProcess nimmt Fokus weg

  Alt 21. Jan 2010, 19:21
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.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
Delphi-Tage 2005-2014
  Mit Zitat antworten Zitat
Shark99

Registriert seit: 16. Mai 2007
403 Beiträge
 
#3

Re: CreateProcess nimmt Fokus weg

  Alt 21. Jan 2010, 19:29
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.
  Mit Zitat antworten Zitat
Shark99

Registriert seit: 16. Mai 2007
403 Beiträge
 
#4

Re: CreateProcess nimmt Fokus weg

  Alt 21. Jan 2010, 19:53
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.
  Mit Zitat antworten Zitat
Shark99

Registriert seit: 16. Mai 2007
403 Beiträge
 
#5

Re: CreateProcess nimmt Fokus weg

  Alt 21. Jan 2010, 22:53
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.
  Mit Zitat antworten Zitat
Shark99

Registriert seit: 16. Mai 2007
403 Beiträge
 
#6

Re: CreateProcess nimmt Fokus weg

  Alt 21. Jan 2010, 23:16
LockSetForegroundWindow() hilft leider auch nicht.
  Mit Zitat antworten Zitat
Shark99

Registriert seit: 16. Mai 2007
403 Beiträge
 
#7

Re: CreateProcess nimmt Fokus weg

  Alt 22. Jan 2010, 00:49
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.
  Mit Zitat antworten Zitat
Benutzerbild von SnergleTheDwarf
SnergleTheDwarf

Registriert seit: 25. Jul 2003
27 Beiträge
 
Delphi 10.4 Sydney
 
#8

Re: CreateProcess nimmt Fokus weg

  Alt 22. Jan 2010, 10:37
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 ?
Best regards
SnergleTheDwarf
  Mit Zitat antworten Zitat
Shark99

Registriert seit: 16. Mai 2007
403 Beiträge
 
#9

Re: CreateProcess nimmt Fokus weg

  Alt 22. Jan 2010, 19:09
Ja, habe alle 12 SW_ Optionen versucht. Wenn eine Anwendung das Messaging über ein unsichtbares Fenster macht (wie Firefox) werden alle SW_ Direktiven ignoriert.
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:37 Uhr.
Powered by vBulletin® Copyright ©2000 - 2021, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2021 by Daniel R. Wolf