Browser öffnen/schließen



  • Zu deinem Befehl zum öffnen von Firefox: Wenn du dich schon speziell Firefox öffnen willst solltest du in der Registry den Pfad abfragen, damit siehst du auch ob Firefox installiert ist.

    Mir stellt sich aber auch die Frage warum du den Browser automatisch wieder schließen willst, eigentlich besteht dazu doch keine Notwendigkeit. Und wenn du dem Benutzer keine Kontrolle lassen willst reicht doch auch eine Internetverbindung ohne Browser.

    Ansonsten könntest du per WinAPI einfach den Prozess terminieren oder das entsprechende Fenster schließen je nach dem was du machen willst.



  • Also erstmal danke für die Antworten!

    das mit der Voraussetzung ob firefox installiert ist usw. soll erstmal nicht wichtig sein, da ich es erst mal nur auf meinem Rechner im Rahmen eines Studienprojektes nutzen will.

    Auf den "TerminateProcesse()" bin ich auch schon gestoßen, allerding hab ich da meine Bedenken wegen des allocierten Speichers.

    Welche Idee ich noch hätte, wäre aus dem Browser ein CStdioFile zu machen, dann mit Open und Close handeln... ist nur die Frage ob das dann so funktioniert



  • Aus dem Browser ein CStdioFile machen?! Äh nein, das bringt dir nix, es sei denn du willst in der firefox.exe rumschreiben statt sie auszuführen...

    Bei TerminateProcess brauchst du dir absolut keine Sorgen um Speicher zu machen. Da kümmert sich das Betriebssystem drum, das wär ja noch schöner.

    Allerdings ist das eine eher unschöne Methode einen Prozess zu beenden, besser wäre eine WM_CLOSE Message zu senden.



  • hab hier was tolles gefunden, allerdings ist mir nicht so ganz klar, wo ich meinen Programmpfad des Browsers einfügen soll, bzw. was noch zu modifizieren ist...

    http://www.c-plusplus.net/forum/39369-full



  • Du benutzt wie im 6. Post (beachte aber auch den nachfolgenden Post) CreateProcess um den Browser zu öffnen. Dabei bekommst du Informationen über den Prozess in Form einer Variable vom Typ PROCESS_INFORMATION.

    Darin steht auch die Prozess ID, mit der kannst du durch OpenProcess ein Handle bekommen und dann den Prozess mit TerminateProcess wieder beenden.



  • Ok, hab nun folgenden Code:

    LPTSTR command = _T("C:\\Program Files (x86)\\Mozilla Firefox\\firefox.exe") ;
    STARTUPINFO si;
    PROCESS_INFORMATION pi;
    
    if(CreateProcess(NULL, command, NULL,NULL,false,
                    CREATE_DEFAULT_ERROR_MODE | NORMAL_PRIORITY_CLASS,
                    NULL,_T("c:\\"),
                    &si, &pi))
    
    HANDLE hProc = OpenProcess(SYNCHRONIZE|PROCESS_TERMINATE, FALSE, pi.dwProcessId);
    

    der in folgender Zeile hängen bleibt:

    &siStartupInfo, &piProcessInfo))
    

    mit dieser Fehlermeldung:

    Unbehandelte Ausnahme bei 0x74a3b763 in DesktopCtrl.exe: 0xC0000005: Zugriffsverletzung beim Schreiben an Position 0x0008758c.



  • Wie wärs mit Variablen initialisieren?



  • Natürlich 😃

    #include "windows.h"
    #include "CStringt.h"
    
    int main()
    {   
    LPTSTR command = _T("C:\\Program Files (x86)\\Mozilla Firefox\\firefox.exe") ;
    STARTUPINFO si;
    PROCESS_INFORMATION pi;
    ZeroMemory( &si, sizeof(si) );
    si.cb = sizeof(si); 
    
    if(!CreateProcess(command, NULL, NULL, NULL,
                       NULL, NULL, NULL, NULL,      
    				   &si, 
    				   &pi))
    
    HANDLE hProc = OpenProcess(SYNCHRONIZE|PROCESS_TERMINATE, FALSE, pi.dwProcessId);
    }
    

    so funktionierts



  • nein Moment,

    wieso macht er nach dem Sleep das Fenster nicht zu?

    hProc = OpenProcess(SYNCHRONIZE|PROCESS_TERMINATE, false, pi.dwProcessId);
    Sleep(2000);
    TerminateProcess(hProc,0);
    


  • Nimm doch einfach ShellExecuteEx mit passendem Flag in der Struktur (NOCLOSE o.Ä.). Das Handle bekommst du dann frei Haus und kannst den Prozess nach einigen Sekunden killen. Außerdem funktioniert es auch dann, wenn Firefox nicht installiert ist.
    Ob's generell Sinn oder Unsinn ist, soll ja hier nicht das Thema sein 🕶 .



  • Eisberg123 schrieb:

    STARTUPINFO si;
    PROCESS_INFORMATION pi;
    ZeroMemory( &si, sizeof(si) );
    si.cb = sizeof(si);
    
    STARTUPINFO si = { sizeof( si ) };
    PROCESS_INFORMATION pi = { };
    

    sollt's auch tun...

    In der ersten Antwort zu http://social.msdn.microsoft.com/Forums/en-US/ieextensiondevelopment/thread/803834b2-4f2a-4880-8bfa-7f23ded7252b findest du vermutlich die Lösung zu deinem Problem mit TerminateProcess() .



  • dieser Code funktioniert mit dem firefox. wenn ich es allerdings mit dem internet explorer mache, stelle ich im Taskmanager fest, dass 2 Prozesse geöffnet werden, und mit TerminateProcess allerdings nur einer davon geschlossen wird... ziemlich komisch

    #include "windows.h"
    #include "CStringt.h"
    #include <iostream>
    using namespace std;
    
    int main()
    {   
    	LPTSTR command = _T("C:\\Program Files (x86)\\Mozilla Firefox\\firefox.exe");
    	STARTUPINFO si = { sizeof( si ) };
    	PROCESS_INFORMATION pi = { };
    	HANDLE hProc;
    
    		if(!CreateProcess(command, NULL, NULL, NULL, true, NULL, NULL, NULL, &si, &pi))
    		{
    			cout << "Fehler"<< endl;	
    		}
    		else
    		{
    			hProc = OpenProcess(SYNCHRONIZE|PROCESS_TERMINATE, false, pi.dwProcessId);
    			Sleep(10000);
    
    			TerminateProcess(hProc,0);
    
    		}	
    
    }
    

  • Mod

    Nö. Das ist nicht komisch. Der Firefox mag nur einen Prozess benutzen. Der IE benutzt für jede Session einen eigenen Prozess und eine eigene Sandbox.

    Zudem würde ich Dir nie raten Prozesse mit TerminateProcess zu beenden.
    Das ist ein Holz-/Vorschlaghammer.


Anmelden zum Antworten