Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
Bei neuem Fenster Ereignis auslösen
Jack_AI
myCSharp.de - Member



Dabei seit:
Beiträge: 198
Herkunft: Erlangen

Themenstarter:

Bei neuem Fenster Ereignis auslösen

beantworten | zitieren | melden

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.
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von Jack_AI am .
private Nachricht | Beiträge des Benutzers
barzelona
myCSharp.de - Member

Avatar #avatar-3416.jpg


Dabei seit:
Beiträge: 166
Herkunft: St. Ingbert - Saarland

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
Jack_AI
myCSharp.de - Member



Dabei seit:
Beiträge: 198
Herkunft: Erlangen

Themenstarter:

beantworten | zitieren | melden

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...
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von Jack_AI am .
private Nachricht | Beiträge des Benutzers
barzelona
myCSharp.de - Member

Avatar #avatar-3416.jpg


Dabei seit:
Beiträge: 166
Herkunft: St. Ingbert - Saarland

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
Jack_AI
myCSharp.de - Member



Dabei seit:
Beiträge: 198
Herkunft: Erlangen

Themenstarter:

beantworten | zitieren | melden

Zitat
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.
Dieser Beitrag wurde 2 mal editiert, zum letzten Mal von Jack_AI am .
private Nachricht | Beiträge des Benutzers
tom-essen
myCSharp.de - Experte

Avatar #avatar-2140.png


Dabei seit:
Beiträge: 1928
Herkunft: NRW

beantworten | zitieren | melden

Zitat
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
private Nachricht | Beiträge des Benutzers
tom-essen
myCSharp.de - Experte

Avatar #avatar-2140.png


Dabei seit:
Beiträge: 1928
Herkunft: NRW

beantworten | zitieren | melden

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) :D.

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
Dieser Beitrag wurde 3 mal editiert, zum letzten Mal von tom-essen am .
Nobody is perfect. I'm sad, i'm not nobody
private Nachricht | Beiträge des Benutzers