Hallo, ich programmiere im Moment an einem kleinen Kommandozeilen-Tool in C unter Visual Studio 2008. Das Tool installiert und richtet einige Sachen ein und sollte daher nach Möglichkeit während der Ausführung nicht geschlossen werden können. Gibt es eine Möglichkeit das Schliessen der Kommandozeile durch den Benutzer zu verbieten? Ich habe im Internet bereits das Tool "DontCloseMe" gefunden, jedoch bräuchte ich dann zu dem Tool selber noch eine zweite Datei. Gesucht ist also eine Möglichkeit dieses "Schliessverbot" selber zu implementieren! Vielen Dank. PS: Verwendet werden soll das Tool später unter XP.
es gibt immer noch den taskmanager...ich wuerde an deienr stelle lieber das kommandozeilenfenster verstecken und aus der taskleiste nehmen und ein weiteres forms fenster anlegen, dass nur sagt "installiere..." und in diesem dann alle "schliessen" events abfangen dass das forms fenster wiederrum anzeigt.
Wird beim Schließen nicht irgendeine Exit-Routine vom OS aufgerufen, bevor es wirklich geschlossen wird? Dann könnte mann doch den Schließbefehl evtl. abfangen (irgendwie ;-) Gegen den Taskmanager biste aber sicherlich machtlos ...
Jens G. schrieb: > Wird beim Schließen nicht irgendeine Exit-Routine vom OS aufgerufen, > bevor es wirklich geschlossen wird? Dann könnte mann doch den > Schließbefehl evtl. abfangen (irgendwie ;-) > Gegen den Taskmanager biste aber sicherlich machtlos ... In C# lässt sich das Schließen einer Form durch Abfangen des FormClosing Events verhindern, indem man das Event canceled. e.Cancel = true; Dann lässt sich die Form beispielsweise nur noch per Task Manager schließen und man schaut dumm aus der Wäsche beim Wegklicken (was natürlich nicht geht). :)
programmer schrieb: > Hallo, > > ich programmiere im Moment an einem kleinen Kommandozeilen-Tool in C > unter Visual Studio 2008. Das Tool installiert und richtet einige Sachen > ein und sollte daher nach Möglichkeit während der Ausführung nicht > geschlossen werden können. Gibt es eine Möglichkeit das Schliessen der > Kommandozeile durch den Benutzer zu verbieten? Ich habe im Internet > bereits das Tool "DontCloseMe" gefunden, jedoch bräuchte ich dann zu dem > Tool selber noch eine zweite Datei. > Gesucht ist also eine Möglichkeit dieses "Schliessverbot" selber zu > implementieren! Nein, sowas geht aus gutem Grund nicht wirklich. Denk mal nach, wie würdest Du es finden wenn jeder Dödel auf Deinem Rechner unschliessbare Progamme machen könnte? Was würde das für die Sicherheit bedeuten? Usw. usf. Mach einfach eine unmissverständliche Anleitung, und entsprechende Ausgaben in das Tool - alles weitere ist am Ende bloss Zeitverschwendung. Und halte einen Baseballschläger oder eine Kettensäge für die unvermeidlichen Schwachköpfe bereit die nicht lesen können/wollen...
ist zwar pure basic aber hier gäbe es die möglichkeit das Event_CloseWindow abzufangen ure basic tut das für dich und gibt dir die Möglichkeit quit nicht durchzureichen indem du die abbruchbedingung nicht erfüllst. habe es gerade ausprobiert.
1 | ; |
2 | ; ------------------------------------------------------------ |
3 | ; |
4 | ; PureBasic - Window example file |
5 | ; |
6 | ; (c) 2001 - Fantaisie Software |
7 | ; |
8 | ; ------------------------------------------------------------ |
9 | ; |
10 | |
11 | ; |
12 | ; Open a window, and do some stuff with it... |
13 | ; |
14 | |
15 | If OpenWindow(0, 100, 200, 195, 260, #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget, "PureBasic Window") |
16 | |
17 | MessageRequester("Information", "Click to move the Window", 0) |
18 | MoveWindow(200,200) ; Move the window to the coordinate 200,200 |
19 | |
20 | MessageRequester("Information", "Click to resize the Window", 0) |
21 | ResizeWindow(320,200) ; Resize the window to 320,200 |
22 | |
23 | ; |
24 | ; This is the 'event loop'. All the user actions are processed here. |
25 | ; It's very easy to understand: when an action occurs, the EventID |
26 | ; isn't 0 and we just have to see what have happened... |
27 | ; |
28 | |
29 | Repeat |
30 | EventID.l = WaitWindowEvent() |
31 | |
32 | If EventID = #PB_Event_CloseWindow ; If the user has pressed on the close button |
33 | Quit = 1 |
34 | EndIf |
35 | |
36 | Until Quit = 1 |
37 | |
38 | EndIf |
39 | |
40 | End ; All the opened windows are closed automatically by PureBasic |
Es geht dem Threadstarter nicht um ein Programm, das in einem Fenster läuft, sondern um eine Konsolapplikation. Die zeichnet sich dadurch aus, daß sie kein Fenster hat und folglich auch keine Fensternachrichten empfangen kann. Eine Konsolapplikation kann einen Eventhandler registrieren, der aufgerufen wird, wenn die Anwendung beendet wird (z.B. durch Schließen des Konsolenfensters oder durch Abmeldung des Benutzers), aber damit lässt sich das Beenden nicht unterdrücken, sondern höchstens um 30 Sekunden herauszögern. http://msdn.microsoft.com/en-us/library/ms686016(v=vs.85).aspx
Vielen Dank euch allen die mir geholfen haben! Rufus' Ansatz war der Richtige, ich habe eine Konsolenapplikation und möchte verhindern, dass die Konsole durch den Benutzer während der Ausführung geschlossen werden, und somit die Anwendung beendet werden kann. Ich habe nun selber noch einige Zeit recherchiert und folgendes gefunden, was bei mir auch wunderbar funktioniert:
1 | DeleteMenu(GetSystemMenu(GetConsoleWindow(), false),SC_CLOSE,MF_BYCOMMAND); |
Duch diesen Befehl wird das X der Kommandozeile deaktiviert, somit kann sie nicht ohne weiteres (den Taskmanager mal außen vorgelassen) geschlossen werden.
und [alt]+[F4]? oder das Menü hinter dem Titelleisten-Icon? oder Doppelklick auf das Titelleisten-Icon?
Vlad Tepesch schrieb: > oder das Menü hinter dem Titelleisten-Icon? > oder Doppelklick auf das Titelleisten-Icon? Das ist das Systemmenü, aus dem "programmer" gerade den "Schließen"-Eintrag entfernt hat. Und der Doppelklick darauf ruft den Default-Eintrag auf (der eben "Schließen" war, jetzt aber nicht mehr ist).
Rufus Τ. Firefly schrieb: > Das ist das Systemmenü, aus dem "programmer" gerade den > "Schließen"-Eintrag entfernt hat. Und der Doppelklick darauf ruft den > Default-Eintrag auf (der eben "Schließen" war, jetzt aber nicht mehr > ist). Exakt, mit Alt+F4 lässt sich die Kommandozeile nun nicht mehr beenden. Auch ein Rechtklick auf das Symbol in der Taskleiste bringt kein "Schliessen"-Feld zum Vorschein, genausowenig wie ein Klick links oben ins Eck der Kommandozeile. Die einzigst verbleibende Möglichkeit wäre nun den Task zu beenden...
Und auch [Strg]+[c] bzw. [Strg]+[break] abgefangen? Volker
Volker Zabe schrieb: > Und auch [Strg]+[c] bzw. [Strg]+[break] abgefangen? > > Volker Das kann er abfangen indem er wie hier zu sehen ist http://msdn.microsoft.com/en-us/library/ms685049%28v=vs.85%29.aspx einen Control Handler einsetzt. Nur das hier while( 1 ){ } empfiehlt sich nicht, sonst gibt es 100% Systemauslastung. Das lässt sich aber beispielsweise durch ein Sleep(100); entschärfen.
programmer schrieb: > Vielen Dank euch allen die mir geholfen haben! > Rufus' Ansatz war der Richtige, ich habe eine Konsolenapplikation und > möchte verhindern, dass die Konsole durch den Benutzer während der > Ausführung geschlossen werden, und somit die Anwendung beendet werden > kann. > > Ich habe nun selber noch einige Zeit recherchiert und folgendes > gefunden, was bei mir auch wunderbar funktioniert: >
1 | > DeleteMenu(GetSystemMenu(GetConsoleWindow(), |
2 | > false),SC_CLOSE,MF_BYCOMMAND); |
3 | >
|
> > Duch diesen Befehl wird das X der Kommandozeile deaktiviert, somit kann > sie nicht ohne weiteres (den Taskmanager mal außen vorgelassen) > geschlossen werden. Es gibt ja noch mehr als den Taskmanager, der ja nun auch kein Geheimnis ist. Letztlich hast Du bloß eine bessere Mausefalle gebaut, woraufhin das Universum sofort dran geht bessere Mäuse zu entwickeln. Das Spiel geht weiter...
Jasch schrieb: > Es gibt ja noch mehr als den Taskmanager, der ja nun auch kein Geheimnis > ist. Den aber darf nicht jeder Benutzer aufrufen oder gar Prozesse damit beenden.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.