Forum: PC-Programmierung Manuelles Schliessen der Kommandozeile verbieten


von programmer (Gast)


Lesenswert?

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.

von asdf (Gast)


Lesenswert?

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.

von Jens G. (jensig)


Lesenswert?

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 ...

von Platinenschwenker .. (platinenschwenker)


Lesenswert?

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

von Jasch (Gast)


Lesenswert?

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...

von Winfried J. (Firma: Nisch-Aufzüge) (winne) Benutzerseite


Lesenswert?

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

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

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

von programmer (Gast)


Lesenswert?

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.

von Vlad T. (vlad_tepesch)


Lesenswert?

und [alt]+[F4]?
oder das Menü hinter dem Titelleisten-Icon?
oder Doppelklick auf das Titelleisten-Icon?

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

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

von programmer (Gast)


Lesenswert?

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...

von Volker Z. (vza)


Lesenswert?

Und auch [Strg]+[c] bzw. [Strg]+[break] abgefangen?

Volker

von Platinenschwenker .. (platinenschwenker)


Lesenswert?

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.

von Jasch (Gast)


Lesenswert?

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...

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

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
Noch kein Account? Hier anmelden.