[C#] Process.start crashed firefox

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • roy-t
  • Registratie: Oktober 2004
  • Laatst online: 08-09 11:33
Ik probeer een klein programmatje te schrijven voor een kiosk computer, op deze computer is de website te zien van een opstelling op firefox met kiosk plugin. Omdat er vaak gebrowst wordt op deze computers is het leuk als de browser uiteindelijk weer op de startpagina gaat. Daarom heb ik de screensaver applicatie aangepast.

Deze bestaat uit twee delen, een eerste deel wat een flashfilmpje start en een tweede deel dat in de achtergrond firefox stopt en weer start met als argument de website.

Nu gaat dit op de ontwikkel computer goed, ook als ik op op de computers via remote desktop de screensaver instel en test gaat het goed: Flashfilmpje verschijnt, in de achtergrond wordt firefox gereset en als je klikt zie je dat de screensaver stopt en dat firefox netjes (fullscreen) blijft staan.

Nu is het probleem zo: als de screensaver gewoon wordt aangeroepen op de computer door de screensaver API van windows draait dit goed, maar zodra je de muis beweegt stopt de screensaver (goed) maar crashed ook firefox. Ik heb geen idee hoe dit kan. Ook omdat het op andere computers wel goed gaat en dus ook zelf via remotedesktop op die computers goed gaat.

De belangrijkste code ziet er als volgt uit, misschien dat iemand hier iets ziet waardoor het zou kunnen komen, ik kan helaas niet op de op afstand beheerde computers debuggen, maar op de lokale computer draait het zelfde os (winxp 32) en dezelfde software.

De flashfilmpjes worden trouwens niet door een externe speler afgespeelt maar in de C# applicatie dmv AxInterop.ShockwaveFlash.

C#:
1
2
3
4
5
6
7
8
9
10
            Thread resetThread = new Thread(new ThreadStart(ResetBrowsers));            
            Thread playerThread = new Thread(new ThreadStart(RunFlashPlayer));
            playerThread.SetApartmentState(ApartmentState.STA);

            playerThread.Start();
            Thread.Sleep(10000);
            resetThread.Start();

            playerThread.Join();
            resetThread.Join();

C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
private static void ResetBrowsers()
 {
                    Process[] processes = Process.GetProcessesByName("firefox");
                    foreach (Process p in processes)
                    {
                        p.Kill();
                    }

                    Process firefox = new Process();
                    firefox.StartInfo.FileName = "firefox.exe";                    
                    firefox.StartInfo.Arguments = Settings.Default.URL;
                    firefox.Start();
}

C#:
1
2
3
4
5
private static void RunFlashPlayer()
{
            Application.Run(new frmFlashPlayer());
//deze stopt via Application.Exit(); firefox zou verder moeten blijven draaien.
}

~ Mijn prog blog!


Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Ik roep maar even wat, maar 't eerste wat me te binnen schiet: onder welk account wordt firefox gestart? Want de screensaver draait, AFAIK, niet onder de huidige gebruiker z'n account maar onder eigen credentials (en volgens mij is die niet "desktop interactive" dinges).

[ Voor 45% gewijzigd door RobIII op 21-09-2009 16:27 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • roy-t
  • Registratie: Oktober 2004
  • Laatst online: 08-09 11:33
RobIII schreef op maandag 21 september 2009 @ 16:23:
Ik roep maar even wat, maar 't eerste wat me te binnen schiet: onder welk account wordt firefox gestart? Want de screensaver draait, AFAIK, niet onder de huidige gebruiker z'n account maar onder eigen credentials (en volgens mij is die niet "desktop interactive" dinges).
Aha! Hier het ik echt geen idee van. Nog maar een keer getest, en deze keer niet door op de preview knop te drukken, maar door netjes een minuut te wachten. Firefox verschijnt wel maar blijkbaar met het 'afsluiten' van de screensaver gebruiker sluit ook firefox. Dit ervaarde ik op de tragere computers als crashen. Wel lastig (doch logisch) dat het dan bij de preview knop wel werkt maar 'in het echt' niet omdat dit twee verschillende methoden zijn.

Nu is alleen de vraag hoe ik het voor elkaar krijg om toch bij idle tijd de browser te 'resetten' ? Een C# app die als user draait en de hele tijd controleert of er nog wel wat gebeurt? En dus deze zelf de screensaver en browser laten spawnen. (Lijkt me een beetje overkill). Of is er een simpele manier om er voor te zorgen om toch als lokale user te draaien. (Ivm security issues denk ik van niet).

Ik heb er ook aan gedacht een firefox plugin schrijven. Maar dit voor de eerste keer doen lijkt me best veel gedoe. Ik kan ook eigenlijk geen goede tutorials vinden over het schrijven van een firefox plugin. Ze zijn nog al wazig en ook op developer.mozilla.org zie ik niet echt een goede documentatie inclusief sample project. Misschien dat iemand hier een sample projectje kan linken? Als ik eenmaal een beetje aan de gang ben kan "if(idletime > x){navigateTo(www.....)))" niet heel erg ingewikkeld zijn neem ik aan?

~ Mijn prog blog!


Acties:
  • 0 Henk 'm!

  • ThaStealth
  • Registratie: Oktober 2004
  • Laatst online: 11-09 10:19
Misschien kan je het beter zo doen:

Background process draait de hele tijd en kijkt of screensaver actief is (via user32.dll), als hij niet meer draait, start firefox, op deze manier voorkom je dat firefox een child process is van je screensaver.

Mess with the best, die like the rest


Acties:
  • 0 Henk 'm!

  • roy-t
  • Registratie: Oktober 2004
  • Laatst online: 08-09 11:33
ThaStealth schreef op maandag 21 september 2009 @ 18:03:
Misschien kan je het beter zo doen:

Background process draait de hele tijd en kijkt of screensaver actief is (via user32.dll), als hij niet meer draait, start firefox, op deze manier voorkom je dat firefox een child process is van je screensaver.
Dat is een goed idee, vooral ook omdat later misschien het programma ook andere dingen dan firefox moet resetten. (Exposities). Volgende week weer aan het werk en dan zal ik is even kijken hoe ik via user32.dll

Ik kwam bij de eerste hit al meteen deze website tegen trouwens: http://www.csharp-dev.com/working-with-windows-screen-saver/ een mooie lijst om meteen alle referenties te zien waarmee je de screensaver status kunt opvragen. Daarmee moet het prima lukken.

~ Mijn prog blog!