Laden...

Bei neuem Fenster Ereignis auslösen

Erstellt von Jack_AI vor 16 Jahren Letzter Beitrag vor 16 Jahren 1.840 Views
J
Jack_AI Themenstarter:in
193 Beiträge seit 2007
vor 16 Jahren
Bei neuem Fenster Ereignis auslösen

Hallo liebe Community.

Ich bringe es gleich auf den Punkt: Ist es möglich das Erzeugen eines neuen, anwendungsfremden Fensters als Ereignis abzufangen? Oder um es noch mal einfacher auszudrücken: User öffnet beliebiges Programm foobar, Programm reagiert -> "Foobar wurde geöffnet"

Grüße,
Jack

PS: Ich habe schon nach dem Problem gesucht, aber keine Lösung gefunden. Ich hoffe also weder, dass das Problem trivial einfach noch unlösbar ist.

165 Beiträge seit 2007
vor 16 Jahren

Ja, geht:


                   WqlEventQuery query = new WqlEventQuery("__InstanceCreationEvent", new TimeSpan(0, 0, 1),
                "TargetInstance isa \"Win32_Process\"");
            ManagementEventWatcher watcher = new ManagementEventWatcher();
            watcher.Query = query;
            watcher.Options.Timeout = new TimeSpan(0, 0, 30); //läuft dann 30sek
            ManagementBaseObject e = watcher.WaitForNextEvent();
            Console.WriteLine("Prozess wurde gestartet: " + 
            ((ManagementBaseObject)e["TargetInstance"])["Name"].ToString());

Visit my Blog: http://michael.barz.de

J
Jack_AI Themenstarter:in
193 Beiträge seit 2007
vor 16 Jahren

Oh cool, mein Programm friert ein...
Ob das etwas damit zu tun hat? Das heißt, ich müsste das in einen Extra-Thread einfügen. Habe ich bisher noch nie gemacht. Werde ich wohl tun müssen.

Danke für deine Antwort, barzelona. Alternativ hätte ich eine Funktion zum Anzeigen der Namen aller offenen Fenster (zur Überprüfung auf neue Fenstern) missbraucht. (Substantivierung rulez)

Geht das auch? Dann brauch ich mich nicht in Threads einzuarbeiten...

165 Beiträge seit 2007
vor 16 Jahren

Hallo, das Einfrieren deines GUI hängt damit zusammen, dass während auf das nächste Event gewartet wird, die Ausführung stillsteht. Von daher würde ich empfehlen das ganze in einem neuen Thread laufen zu lassen.

Visit my Blog: http://michael.barz.de

J
Jack_AI Themenstarter:in
193 Beiträge seit 2007
vor 16 Jahren

Original von barzelona
Ja, geht:

  
                   WqlEventQuery query = new WqlEventQuery("__InstanceCreationEvent", new TimeSpan(0, 0, 1),  
                "TargetInstance isa \"Win32_Process\"");  
            ManagementEventWatcher watcher = new ManagementEventWatcher();  
            watcher.Query = query;  
            watcher.Options.Timeout = new TimeSpan(0, 0, 30); //läuft dann 30sek  
            ManagementBaseObject e = watcher.WaitForNextEvent();  
            Console.WriteLine("Prozess wurde gestartet: " +   
            ((ManagementBaseObject)e["TargetInstance"])["Name"].ToString());  

Ich habe das mal so 1 zu 1 übernommen, nachdem ich mit dem Code zugegebenermaßen nicht viel anfangen kann und habe die letzte Zeile auf MessageBox abgeändert. Das Ganze läuft in einem neuen Thread per


ThreadZwei = new Thread(new ThreadStart(WatchWindows));

Allerdings passiert gar nichts. Ich zweifel nicht daran, dass der Code funktioniert. Das Problem ist wohl eher meine Unkenntnis. Sehe ich das richtig, dass die Zeile


Console.WriteLine("Prozess wurde gestartet: " + 
            ((ManagementBaseObject)e["TargetInstance"])["Name"].ToString());

automatisch ausgelöst wird, sobald ein neuer Prozess dazu kommt?

Danke,
Jack

PS: Ich habe mich jetzt mal grob in Threads eingearbeitet. Wenn jemand zufällig eine Lösung parat hat, wie ich einen zweiten Thread zusammen mit dem GUI-Thread beenden kann, wäre ich dankbar. Aber das ist nur sekundär.

1.820 Beiträge seit 2005
vor 16 Jahren

Original von barzelona
Ja, geht:

  
                   WqlEventQuery query = new WqlEventQuery("__InstanceCreationEvent", new TimeSpan(0, 0, 1),  
                "TargetInstance isa \"Win32_Process\"");  
            ManagementEventWatcher watcher = new ManagementEventWatcher();  
            watcher.Query = query;  
            watcher.Options.Timeout = new TimeSpan(0, 0, 30); //läuft dann 30sek  
            ManagementBaseObject e = watcher.WaitForNextEvent();  
            Console.WriteLine("Prozess wurde gestartet: " +   
            ((ManagementBaseObject)e["TargetInstance"])["Name"].ToString());  

Hallo!

Nachdem ich das obige Beispiel mal ausprobieren wollte, habe ich eine ManagementException erhalten. Hab' dann nochmal alle Werte überprüft, und die MSDN zu Rate gezogen, konnte aber keinen Fehler feststellen.

Hab' dann noch ein weiteres Beispiel mit einem Timer in der MSDN gefunden, welches mit demselben Fehler abbricht.

Muss' ich noch irgendwas nachinstallieren (eigentlich ist WMI doch fester XP-Bestandteil, oder)?

EDIT: Hab' grade mal den WMI-Code-Generator von Microsoft getestet, der schmeißt denselben Fehler 😦
EDIT2: Alle Prozesse auflisten geht seltsamerweise. Es scheint speziell Probleme beim erstellen/abfangen von WMI-Events zu geben.

Nobody is perfect. I'm sad, i'm not nobody 🙁

1.820 Beiträge seit 2005
vor 16 Jahren

Hallo!

Nachdem ich nun noch irgendwo bei Microsoft ein WMI-Diagnose-Tool gefunden und ausgeführt hatte, wurde mir bei Sichtung des Protokolls klar, dass da einiges im argen war. Ich konnte auch in der Systemsteuerung/Verwaltung/Computerverwaltung nicht auf die WMI-Steuerung zugreifen. Hab' also das WMI-Repository komplett gelöscht, Rechner neu gestartet, sämtliche Berechtigungen bzgl. WMI auf Standard gesetzt, ...

Ich bekomme nun im Systemlog keine WMI-Fehlermeldungen mehr und kann auf die WMI-Steuerung zugreifen 8) 😄.

Und dank der Meldungen von WMIdiag konnte ich auch in der Registry den Schlüssel ändern, welcher die WMI-Events aktiviert 8o.

Es geht also jetzt, leider habe ich keine Ahnung, warum er mir das alles zerhauen hab', immerhin hab' ich den Rechner erst vor ca. 5 Wochen komplett neu installiert.
Ausserdem zeigt mir WMIdiag immer noch 27 Fehler an, welche ich nicht nachvollziehen kann, da z.B. bemängelte Berechtigungen definitiv gesetzt sind ?(.

Wahrscheinlich irgendein Programm (evtl. das AVG-Anti-Rootkit-Tool).

Für alle, welche evtl. ähnliche WMI-Probleme haben, hier noch ein meiner Meinung nach sehr nützlicher Artikel.

Ausserdem noch der Link zum WMI-Diagnose-Tool.

Und von Microsoft noch ein Link bzgl. WMI-Troubleshooting.

Edit:
Jetzt gibt's auch ein Projekt von juLz im Forum: WMIRepair - Kleines Tool um den WMI Dienst wiederherzustellen

Nobody is perfect. I'm sad, i'm not nobody 🙁