die Form so beenden, dass das Programm noch auf events reagieren kann

maria1

Mitglied
Hallo,

ich programmiere seit neustem in der Entwicklungsumgebung Visual Studio 2010 unter Verwendung der .net Bibliothek mit der Programmiersprache c#.

Es geht darum, dass ich ein Programm schreiben möchte welches Folgende ermöglicht:
Mein Programm soll bei Systemstart starten und zunächst gar nichts machen, es soll nur auf Events reagieren können. Ein anderes Programm sendet ein Event, welches mein Programm aufnehmen soll und dann die MainForm(also meine Benutzeroberfläche) starten soll. Wenn ich diese mit dem rechts oberen Schließbutton schließe, soll die Form geschlossen werden und das Programm soll wieder seinen Ausgangszustand erreichen und wieder auf ein nächstes Event warten. Also das Programm darf nicht geschlossen werden. Wenn der nächste Event kommt soll die Form wieder neu aufgebaut werden und angezeigt werden. Erst beim Computer herunterfahren soll das Programm geschlossen werden. Ist das so möglich, wie ich mir das gedacht habe? Da ich so was noch nie gemacht habe, wäre ich wirklich sehr dankbar, wenn ihr mir die wichtigsten Punkte nennen könntet, die ich für das Umsetzen benötigen werde und bedenken sollte(das prinzipielle Vorgehen), die Events die ich benötige etc..Bin sehr dankbar für jeden Hinweis!
 
Hallo,

um das zu erreichen, darf deine MainForm nicht via "Application.Run() " in der Main()-Methode geöffnet werden. Du könntest eine eigene Klasse von "ApplicationContext" ableiten und dort die ganze "fensterlose" Logik (die von dir genannten Events) implementieren. Ein Objekt dieser Klasse wird dann in "Application.Run() " verwendet und sorgt auch für's Öffnen der Hauptform.

Gruß
MCoder
 
Vielen Dank für deine schnelle Antwort und deinen super Hinweis. Ich habe auf der folgenden Seite ein Beispiel gefunden, welche eine gute Vorlage für meine Arbeit sein wird: http://msdn.microsoft.com/en-us/libr...oncontext.aspx

Hab aber noch einige Fragen dazu:
1. Weißt du vielleicht auch, ob das alles funktionieren würde, wenn mein Programm ein Plugin wäre(muss ein Plugin sein!)****? Also ich würde das „Application.Run(Objekt von MyApplicationContex)“ nicht in der Main aufrufen sondern in einer Methode meines Plugins?Geht das überhaupt?...Und wenn nicht was müsste ich vom Prinzip her anders machen****
2. Ich möchte dieses Plugin bei Programmstart starten, weißt du wie ich das machen kann oder ob das überhaupt möglich ist? (Programmieren unter dem Betriebssystem Windows xp)
3. Wenn Punkt zwei überhaupt klappen würde, möchte ich dieses „ExitThread()“(um mein Plugin zu beenden) erst aufrufen, wenn mein der Computer heruntergefahren werden soll. Sollte ich das mit Eintreten des „SystemEvents.SessionEnded-Ereignis“ oder „SystemEvents.SessionEnding-Ereignis“ machen?

Sorry für meine vielen Fragen

Viele Grüße
 
2. Ich möchte dieses Plugin bei Programmstart starten, weißt du wie ich das machen kann oder ob das überhaupt möglich ist? (Programmieren unter dem Betriebssystem Windows xp)
Du kannst das Programm, für das dein Plugin gedacht ist, in den Autostart von Windows schreiben. Ob das Programm aber dann dein Plugin startet bleibt dem Programm überlassen.
Dein MSDN-Link ist übrigens kaputt.
 
Meinst du also, ich muss erst ein eigenständiges Programm schreiben(mit main()), welches dann erst mein Plugin aufruft. Und ich müsste mein eigenständiges Programm im Autostart eintragen?

Gibt es keine Möglichkeit mein Plugin von einem WindowsInterface zu Vererben, welches dann direkt beim Autostart geladen und gestartet wird?

Bin sehr dankbar, wenn mir jemand noch Hinweise zu den Fragen 1 und 3 geben würde:)

Hier nochmal der Link der oben kaputt war:
http://msdn.microsoft.com/en-us/library/system.windows.forms.applicationcontext.aspx

Gruß
 
Meinst du also, ich muss erst ein eigenständiges Programm schreiben(mit main()), welches dann erst mein Plugin aufruft.
Ja. Das ist ja gerade (mehr oder weniger) die Definition eines Plugins.

Die Antwort zu Frage 3 ist ziemlich eindeutig, wenn du dir die Dokumentation der beiden Ereignisse durchließt (hier und hier). Du musst dich halt fragen, was du willst. Ich schätze der Versuch des Abmeldens interessiert dich nicht. Also solltest du das SessionEnded-Ereignis verwenden.
 
Hallo,

kein Grund, sich für's Fragenstellen zu entschuldigen. Allerdings kann ich deine Fragen kaum beantworten, weil ich keine Ahnung habe, wie das Plugin-System funktioniert. Sind daher alles nur Vermutungen :)

1. Weißt du vielleicht auch, ob das alles funktionieren würde, wenn mein Programm ein Plugin wäre(muss ein Plugin sein!)****?
Ich gehe mal davon aus, dass die Hauptnachrichtenschleife irgendwo im Framework des Plugin-Systems läuft, so dass wahrscheinlich die Geschichte mit dem ApplicationContext nicht notwendig ist. Stellst du das Plugin als Klassenbibliothek (DLL) bereit? Dann wird dir vermutlich vorgegeben sein welche öffentlichen Methoden bzw. Ereignishandler zu implementieren sind und du dich eigentlich nur um Anzeigen und Verstecken des Fenster kümmern musst.

2. Ich möchte dieses Plugin bei Programmstart starten, weißt du wie ich das machen kann oder ob das überhaupt möglich ist? (Programmieren unter dem Betriebssystem Windows xp)
Was meinst du mit Programmstart: Windows oder das Plugin-System? Ersteres ist Sache des Plugin-Frameworks. Da hast du vermutlich keinen Einfluss drauf. Beim zweiten müsstest du eigentlich irgendeine Schnittstelle haben, über die das Laden des Plugins festgestellt werden kann.

3. Wenn Punkt zwei überhaupt klappen würde, möchte ich dieses „ExitThread()“(um mein Plugin zu beenden) erst aufrufen, wenn mein der Computer heruntergefahren werden soll. Sollte ich das mit Eintreten des „SystemEvents.SessionEnded-Ereignis“ oder „SystemEvents.SessionEnding-Ereignis“ machen?
Die von dir genannten Events machen Sinn, wenn am Ende noch irgendwas zu erledigen ist. Das Beenden selber noch irgendwie zu forcieren ist eigentlich überflüssig. Beim Herunterfahren gehen sowieso überall die Lichter aus.

Gruß
MCoder
 
Vielen Dank für all euere Beiträge. Ihr hilft mir wirklich sehr damit!

Also mein Plugin wird als Klassenbibliothek bereitgestellt. Wie meinst du das mit Verstecken und Anzeigen des Fensters? Wie mache ich denn so etwas, ohne diesen „ApplicationContext“. Wenn ich mein Fenster Anzeige und dann auf den Close Button(rechts oben) klicke, beendet sich doch alles! Aber ich möchte, dass das Plugin trotzdem auf Events reagieren kann(Events von anderen Programmen)…also muss es im Hintergrund ja irgendwie noch laufen. Ist das mit dem Ausblenden eine saubere Lösung, wenn ja wie mach ich das denn vom Prinzip her? Frage nur, weil ich so was echt noch nie gemacht habe….

Hier einmal der Überblick über mein Vorhaben:
Zum einen soll das Plugin als Tool fungieren, zum anderen beim Windows start bis zum Herunterfahren des Computers im Hintergrund laufen. Dafür werde ich zwei verschiedene Instanzen des Plugins erstellen. Als Tool wird die Benutzerfläche sofort angezeigt und beim CloseButton das Plugin wirklich beendet!
Als Plugin, welches immer im Hintergrund aktiv ist soll es nur auf äussere Events reagieren und nur bei bestimmten Events soll die Form erstellt werden…wenn ich die Form schließe, sollte man wieder in den Ausgangszustand kommen. Und beim nächsten Event soll die Form wieder erstellt werden…Also das Plugin soll nicht beendet werden(erst beim Herunterfahren von Windows)!

Beim zweiten Fall weiß ich einfach nicht, wie ich das Fenster schließen soll, ohne dass mein Plugin beendet wird…:(



Gruß
Maria1
 
Hallo Maria1,

ein Fenster kannst du mit Form.Show() anzeigen und mit Form.Hide() wieder ausblenden, ohne das es zerstört wird. Bevor dein Fenster geschlossen wird (Close Button) wird ein FormClosing-Event geworfen, in dem du das Schließen verhindern und stattdessen das Fenster nur ausblenden kannst.

Was passiert denn eigentlich wann dein Plugin vom übergeordneten System geladen wird bzw. wie und von welchen Objekten werden denn die Instanzen erstellt? Wahrscheinlich ist es sinnvoll die Hintergrundaktivitäten von der Fensteranzeige zu trennen.

Gruß
MCoder
 
Hey,
ich versuch mein Problem nochmal deutlicher darzustellen um Missverständnisse zu vermeiden...

1.Ich habe vor ein Plugin zu schreiben(.dll), welche als Tool eingesetzt werden soll. Dieses Tool(mein Plugin) wird von einem Programm(nicht meins) geladen(und damit entsteht eine erste Instanz meines Plugins). Dieses Programm ruft anschließend den Constructor meines Plugins auf, welcher mir dann eine Benutzeroberfläche zeigt, wo der Benutzer Einstellungen vornehmen kann. Die Einstellungen werden, wenn der Benutzer das Fenster schließt, auf die Festplatte gespeichert(.txt oder .xml)

2.Wird von einem anderen Programm ein bestimmter Knopf gedrückt, sollen diese Einstellungen(die der Benutzer vorher gemacht hat und die nun auf der Festplatte gespeichert sind) nochmals angezeigen. Dafür sollen die Einstellungen von der Festplatte geladen und das Fenster neu erstellt und angezeigt werden.
Dadurch dass dieses Event zu jederzeit kommen kann, muss mein Plugin auch jederzeit im Hintergrund aktiv sein.
Um das Umzusetzen habe ich vor, ein Hauptprogramm zu schreiben, welche mein Plugin ladet. Die .exe von meinem Hauptprogramm soll im Autostart gespeichert werden, so dass beim windows- start mein Hauptprogramm direkt gestartet wird und mein Plugin geladen wird(und damit entsteht eine zweite Instanz meines Plugins).
Ist das realistisch ...und sollte ich dann diekt nach dem Laden meines Plugins(das plugin, welches immer im Hintergrund aktiv sein soll) ein Fenster erstellen und das solange Verstecken(mit form.hide) bis ein Event kommt...und dann den Inhalt des Fensters erstellen und erst dann mit (form.show)anzeigen...und dann wieder mit hide verstecken?....meinst du das wäre eine gute Lösung?(Nebenfrage: Und könntest du mir vielleicht noch sagen, wie ich den kompletten Inhalt einer Form lösche...gibt es dafür eine Methode?)

Gruß
maria1
 
Zuletzt bearbeitet:

Neue Beiträge

Zurück