Firefox Hide=True Problem

  • Hallo!

    Ich habe bis jetzt mit der IE.au3-library gearbeitet. Für den FF bekomme ich mein Programm einfach nicht zum laufen.
    Mein Programm arbeitet im Hintergrund und öffnet den IE versteckt.
    Selbiges möchte ich auch mit dem Firefox machen. Leider hat dieser aber gerade beim versteckten Aufruf ein großes Problem damit.

    Mein Code sieht wie folgt aus:

    Wenn ich nun das Programm aufrufe, wird Firefox geöffnet und meine Maus bleibt hängen. Erst der Aufruf des Taskmanagers "löst" die Maus wieder...

    Ich verwende Windows 7 64bit und den aktuellsten Firefox (5.0.1) mit Moz Repl 1.1 Beta2

    Bitte um Hilfe!

  • Wüsste nicht warum deine Maus hängen bleiben sollte. Die FF Funktionen haben keinerlei Einfluß auf Eingabegeräte. Wenn das also wirklich dein komplettes Script ist kann ich mir den Fehler beim besten Willen nicht erklären.
    Tritt das Problem denn auch beim sichtbaren Start auf? schonmal eine 3er Version von FF getestet?

  • Hallo!

    Nein das Problem tritt nur auf wenn ich Hide aktiv habe... FF3 werd ich mal ausprobieren,... eventuell noch den Avira Antivir deaktivieren, vielleicht verhindert der das nur irgendwie?!

    Werd mich dann wieder melden.

  • Zitat

    eventuell noch den Avira Antivir deaktivieren, vielleicht verhindert der das nur irgendwie?


    Kann ich mir nicht vorstellen. Das Problem liegt vermutlich eher bei deinem System, da es bisher noch keine Probleme deiner Art gab (zumindest glaube ich das). Am besten mal mit der alten Firefox Version versuchen. Ansonsten fällt mir ehrlich gesagt nichts ein, woran es sonst liegen könnte.

  • Habe gerade die FF3.6.19 Version ausprobiert... mit der funktioniert es mit dem bekannten Problem das er nicht "versteckt" startet und dann erst nach 1-2 sekunden schließt...

    Sehr seltsam das ganze :(

    Gibt es da echt keine Möglichkeit das ganze wie beim IE ablaufen zu lassen?

  • Ich arbeite ja bekanntlich weder mit FF noch mit IE aber gestern hab ich es mal gewagt, MozRepl zu installieren.

    Das Ergebnis war, das das Skript aus dem Startpost den FF maximiert startete und das System zum hängen brachte. Keine Reaktion auf Tastatur oder Maus. Hot Button. Da war meine Begeisterung dann auch schon wieder verflogen.

    Firefox 4 auf Win7 Ultimate 64bit
    MozRepl in der aktuellen beta

    Mag jetzt nicht besonders hilfreich sein, loswerden musste ich es aber trotzdem.

  • Zitat


    Das Ergebnis war, das das Skript aus dem Startpost den FF maximiert startete und das System zum hängen brachte. Keine Reaktion auf Tastatur oder Maus. Hot Button. Da war meine Begeisterung dann auch schon wieder verflogen.

    Firefox 4 auf Win7 Ultimate 64bit
    MozRepl in der aktuellen beta

    Mag jetzt nicht besonders hilfreich sein, loswerden musste ich es aber trotzdem.


    Das ist weniger toll... Vielleicht hat die neue MozRepl ein Problem mit 64Bit Systemen. Vielleicht kann Stilgar ja weiterhelfen bzw. die Entwickler von MozRepl.

  • Ich hoffe es... und vielleicht gibts dann auch ne Lösung für das Problem mit dem nicht sofortigen "hiden" der FF-Anwendung...

  • Seit v4 hat FF ein neues Fensterhandle bekommen,deswegen bleibt er auch am

    [autoit]

    WinWaitActive

    [/autoit]

    hängen, und da vorher noch ein blockinput gemacht wird,
    bleibt das ganze system hängen...

    Das neue Fensterhandle heisst: "[CLASS:MozillaWindowClass]"

    Einfach ersetzen und schon müssts gehn..(also so wars bei mir)


    Edit: Für das "FF-verstecken-Problem" gibt es leider bisher keine bessere Lösung , bin da momentan im offi Forum am kämpfen

    MfG hellboy

    [autoit]

    Do
    _help($user)
    Until $questions = 0

    [/autoit]

    Meine Werke:
    Ste`s Web-Radio

    Einmal editiert, zuletzt von hellboy3 (2. August 2011 um 22:04)

  • :sleeping: Wie meinst du das mit dem "[CLASS:MozillaUIWindowClass]"? - (Sorry falls das eine Anfängerfrage ist).

    Wie kann ich das umsetzen?

    Habs mal so probiert:
    Von

    Code
    ;~ 	If $bHide Then
    ;~ 		Local $hWin = _FFWindowGetHandle()
    ;~ 		WinSetState($hWin, "", @SW_HIDE)
    ;~ 	EndIf

    zu

    Code
    If $bHide Then
    		WinWaitActive("[CLASS:MozillaUIWindowClass]")
    		WinSetState("[CLASS:MozillaUIWindowClass]", "", @SW_HIDE)
    	EndIf

    mit dem 3.6.19 FF hats eben noch funktioniert (so wie vorher auch schon, laggen tut er dann trotzdem kurz)... - mit dem FF5 funktionierts weiterhin nicht - da hilft nur den Taskmanager mit Strg+Alt+Entf aufrufen..

    Einmal editiert, zuletzt von nordx (2. August 2011 um 08:50)

  • Ach stimmt da war was. Die problematische Stelle befindet sich in der Funktion __FFStartProcess()
    Einfach dort die Änderung vornehmen, dann sollte das klappen. Oder du benutzt die Funktion der FF.au3 erst garnicht um FF zu starten, sondern machst das so:

    [autoit]


    $ffProzess = Run(@ScriptDir & "\FirefoxPortable.exe", "", @SW_SHOW) ; ggf. hier @SW_HIDE benutzen wenn du es verstekt haben willst
    Do
    _FFConnect()
    $OK = @error
    If @error Then _FFDisConnect()
    Until Not $OK

    [/autoit]
  • Hallo,

    genau einfach besagte Änderung vornehmen.

    Der versteckte Modus (mit dem ich mich nie sonderlich beschäftigt habe, da ich keine Verwendung dafür habe und sehe) hatte bis zu einer bestimmten Version auch einfach mit @SW_HIDE funktioniert, wobei ich nicht mehr Nachvollziehen kann ob dann AutoIt oder FireFox "Schuld" war das es nicht mehr funktionierte, seitdem ist das Ganze ein ziemlich blöder Workaround, dass es zumindest halbwegs funktioniert.

    Ich werde es mal überarbeiten.

    Grüße
    Stilgar

  • Ach stimmt da war was. Die problematische Stelle befindet sich in der Funktion __FFStartProcess()
    Einfach dort die Änderung vornehmen, dann sollte das klappen.

    inder _FFStartProcess() ? Ich verwende doch die _FFStart()... *verwirrt bin* -
    Ups, lese es gerade in der FF.au3..." #INTERNAL_USE_ONLY# "

    In der _FFStartProcess() wird bereits der neue Handler ([CLASS:MozillaUIWindowClass]) verwendet.

    Code
    If $bHide Then
    		Local $WINTITLE_MATCH_MODE = AutoItSetOption("WinTitleMatchMode", 4)
    		WinWaitActive("[CLASS:MozillaUIWindowClass]")
    		Sleep(500)
    		WinSetState("[CLASS:MozillaUIWindowClass]", "", @SW_MINIMIZE)
    		BlockInput(0)
    		AutoItSetOption("WinTitleMatchMode", $WINTITLE_MATCH_MODE)
    	Else
    		Sleep(1000)
    	EndIf

    Werde es aber jetzt mal mit deinem Workaround da probieren.


    Der versteckte Modus (mit dem ich mich nie sonderlich beschäftigt habe, da ich keine Verwendung dafür habe und sehe)...


    Verwendung ist bei mir folgende:
    Ich habe eine Homepage von der Informationen in gewissen Abständen abgerufen werden sollen und in mein Programm "eingetrichtert" werden. Da ich meinen PC aber auch gerne weiterhin, während der Arbeit dieses "Bots" weiterverwenden möchte, sollte das ganze am besten im Hintergrund passieren (mit dem IE funktioniert das auch schon super und ohne laggs - nur möchte ich das Script nun auch für Firefox-Nutzer zur Verfügung stellen)

    Ich werde es mal überarbeiten.


    Das wäre super - Ich danke dir schon jetzt!

  • In der _FFStartProcess() wird bereits der neue Handler ([CLASS:MozillaUIWindowClass]) verwendet.


    Falsch. Die neue WindowClass ab FF Version 4 lautet "MozillaWindowClass", also ohne das "UI". Könnte höchstens sein, dass es in FF5 wieder zurückgeändert wurde, hab die 5er noch nicht angesehn, aber dann sollten ja keine Proleme auftreten. ;)

  • Habs jetzt mit beiden ausprobiert. Also einmal so:

    Code
    If $bHide Then
    		Local $WINTITLE_MATCH_MODE = AutoItSetOption("WinTitleMatchMode", 4)
    		WinWaitActive("[CLASS:MozillaWindowClass]")
    		Sleep(500)
    		WinSetState("[CLASS:MozillaWindowClass]", "", @SW_MINIMIZE)
    		BlockInput(0)
    		AutoItSetOption("WinTitleMatchMode", $WINTITLE_MATCH_MODE)
    	Else
    		Sleep(1000)
    	EndIf

    und einmal so:

    Code
    If $bHide Then
    		Local $WINTITLE_MATCH_MODE = AutoItSetOption("WinTitleMatchMode", 4)
    		WinWaitActive("[CLASS:MozillaUIWindowClass]")
    		Sleep(500)
    		WinSetState("[CLASS:MozillaUIWindowClass]", "", @SW_MINIMIZE)
    		BlockInput(0)
    		AutoItSetOption("WinTitleMatchMode", $WINTITLE_MATCH_MODE)
    	Else
    		Sleep(1000)
    	EndIf

    Beides ergab den selben Fehler (FF5 legt das System lahm... erst über Aufrufen des Taskmanagers kann man die Maus bzw den PC wieder verwenden).

  • Teste mal bitte ob das Problem innerhalb von 30 Sekunden verschwindet, denn das würde bedeuten, dass er schon in der Schleife vor der WindowClass Geschichte hängen bleibt:

    [autoit]


    Local $iTimeOutTimer = TimerInit()
    While 1
    Sleep(2000)
    If ProcessExists($sProcName) Then ExitLoop
    If (TimerDiff($iTimeOutTimer) > $iTimeOut) Then
    SetError(__FFError($sFuncName, $_FF_ERROR_Timeout, "Browser process not exists: " & $sProcName))
    BlockInput(0)
    Return 0
    EndIf
    WEnd

    [/autoit]

    Wenn er hier drin hängt findet er den Prozessnamen nicht. Sinnvoller wäre es hier sowieso auf die Variable $PID (Prozess ID) und nicht auf den Prozessnamen zu prüfen. Vielleicht hat sich da in der 5er Version auch was geändert, oder aber der Pfad weiter oben aus der Registry wird überhaupt nicht richtig ausgelesen, dann solltest du in der Scite console aber einen Hinweis sehen.

    EDIT: Der Workaround, also der Verzicht auf die _FFstart() Funktion klappt jedenfalls auch mit FF5, gerade getestet.

    Einmal editiert, zuletzt von misterspeed (2. August 2011 um 16:43)

  • Also von welchem Workaround ist jetzt die Rede? Wie verzichtest du auf _FFStart()??

    Ach meinst du den:

    [autoit]

    $ffProzess = Run(@ScriptDir & "\FirefoxPortable.exe", "", @SW_SHOW) ; ggf. hier @SW_HIDE benutzen wenn du es verstekt haben willst
    Do
    _FFConnect()
    $OK = @error
    If @error Then _FFDisConnect()
    Until Not $OK

    [/autoit]


    ?

    Werds jetzt mal mit dem testen.

    LG

    EDIT: habs jetzt noch getestet und ca. ne Minute gewartet... geht garnix weiter! -> STRG+ALT+Entf...

  • Machs einfach damit:

    Spoiler anzeigen
    [autoit]

    Func __FFStartProcess($sURL = "about:blank", $bNewWin = False, $sProfile = "default", $bNoRemote = False, $bHide = False, $iPort = 4242, $iTimeOut = 30000)
    Local Const $sFuncName = "__FFStartProcess"

    [/autoit] [autoit][/autoit] [autoit]

    Local $PID = -1
    Local $sNoRemote = "", $sNewWin
    Local $sProcName = $_FF_PROC_NAME

    [/autoit] [autoit][/autoit] [autoit]

    If $sProfile = "default" Then
    $sProfile = ''
    Else
    $sProfile = ' -P "' & $sProfile & '"'
    EndIf
    If $bNoRemote Then $sNoRemote = "-no-remote"
    If $bNewWin Then $sNewWin = "-new-window"
    $sURL = '"' & $sURL & '"'
    If $iTimeOut < 2000 Then $iTimeOut = 2000

    [/autoit] [autoit][/autoit] [autoit]

    Local $sHKLM = "HKEY_LOCAL_MACHINE\SOFTWARE\Mozilla\Mozilla Firefox"
    Local $sFFExe = RegRead($sHKLM & "\" & RegRead($sHKLM, "CurrentVersion") & "\Main", "PathToExe")
    If @error Then
    SetError(__FFError($sFuncName, $_FF_ERROR_GeneralError, "Error reading registry entry for FireFox." & @CRLF & _
    "HKEY_LOCAL_MACHINE\SOFTWARE\Mozilla\Mozilla Firefox\*CurrentVersion*\Main\PathToExe" & @CRLF & _
    "Error from RegRead: " & @error))
    Return 0
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    Local $sCommand = StringFormat('"%s" %s %s %s -repl %i %s', $sFFExe, $sNewWin, $sURL, $sNoRemote, $iPort, $sProfile)
    $PID = Run($sCommand)
    ;~ If $bHide Then BlockInput(1)
    Local $iTimeOutTimer = TimerInit()
    Do
    Sleep(20)
    If (TimerDiff($iTimeOutTimer) > $iTimeOut) Then
    SetError(__FFError($sFuncName, $_FF_ERROR_Timeout, "Browser process not exists: " & $sProcName))
    ;~ BlockInput(0)
    Return 0
    ExitLoop
    EndIf
    Until WinExists("Mozilla Firefox")

    If $bHide Then
    WinSetTrans("Mozilla Firefox", "", 0)
    Sleep(200)
    WinSetState ("[Last]", "", @SW_HIDE)
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    If $_FF_COM_TRACE Then ConsoleWrite('__FFStartProcess: "' & $sCommand & @CRLF)

    [/autoit] [autoit][/autoit] [autoit]

    SetExtended($PID)
    Return 1
    EndFunc ;==>__FFStartProcess

    [/autoit]

    Edit: Hatte mich oben beim Fensterhandle verschrieben , ohne UI natürlich, hab`s korrigiert. :)

    Zitat

    Der versteckte Modus (mit dem ich mich nie sonderlich beschäftigt habe, da ich keine Verwendung dafür habe und sehe)...

    Ich habe Verwendung dafür und es gibt genug andere Leute die das auch schon angefragt bzw. bemängelt haben ...

    MfG hellboy

    [autoit]

    Do
    _help($user)
    Until $questions = 0

    [/autoit]

    Meine Werke:
    Ste`s Web-Radio

  • Juhu, Klasse!!
    Damit klappts :) - Jetzt muss ich nur noch rausfinden wie ich ein Objekt erstelle wie beim IE.

    beim IE mach ich das ja indem ich schreibe:

    [autoit]

    $myIE = _IECreate("http://www.google.at",0,0)

    [/autoit]

    dann hab ich mein definiertes Objekt ($myIE)... damit kann ich dann arbeiten...

    Weil wenn ich während der abarbeitung meines Skripts, selber ein Firefox-Fenster aktiv habe (bzw dieses verwende), verwendet das Skript auf einmal diesen... was ja auch logisch is da ich nicht definiert habe welches Fenster er verwenden soll...

    Hast du da eventuell auch schon gleich nen Tipp? (Werd natürlich jetzt nebenbei auch schonmal die Doku von Thorsten durchforschen)

    Vielen Dank!

    LG

  • Zitat

    Weil wenn ich während der abarbeitung meines Skripts, selber ein Firefox-Fenster aktiv habe (bzw dieses verwende), verwendet das Skript auf einmal diesen... was ja auch logisch is da ich nicht definiert habe welches Fenster er verwenden soll...

    Die Methode ist nicht die beste , das ist klar , aber ist dir das damit passiert oder vermutest du nur das es passieren könnte?
    Ich zumindest hatte mit diesem Workaround bisher keine Probleme (er verwendet ja automatisch NUR das fenster , welches auch durch _FFStart() erstellt wurde) :)

    MfG hellboy

    [autoit]

    Do
    _help($user)
    Until $questions = 0

    [/autoit]

    Meine Werke:
    Ste`s Web-Radio