Xbase-Anwendung über Task-Manager beenden
Moderator: Moderatoren
-
- Rekursionen-Architekt
- Beiträge: 194
- Registriert: Fr, 24. Feb 2006 8:09
- Kontaktdaten:
Xbase-Anwendung über Task-Manager beenden
Hi,
gibt es eine Möglichkeit zu erfahren (ich will dann darauf reagieren können) wenn meine Xbase-Anwendung nicht "normal" beendet, sondern vom User über den Task-Manager "abgeschossen" wird. (Prozess beenden)?
Grüße,
Notloesung
gibt es eine Möglichkeit zu erfahren (ich will dann darauf reagieren können) wenn meine Xbase-Anwendung nicht "normal" beendet, sondern vom User über den Task-Manager "abgeschossen" wird. (Prozess beenden)?
Grüße,
Notloesung
-
- UDF-Programmierer
- Beiträge: 92
- Registriert: Di, 19. Dez 2006 19:37
- Wohnort: Düsseldorf
- Kontaktdaten:
Hallo Notloesung,
wenn Du mit Express arbeitest, gibt es unter den GETOPTIONS
eine Option:
QUITQUERY MSG {||(schliessen()}
.
.
.
FUNCTION schliessen() //Wenn Windows beendet wird.
local nRueck:=0 //XBP_ALLOW, XBP_REJECT
IF abmeld() //Frage ob beendet werden soll
nRueck:=XBP_ALLOW
ELSE
nRueck:=XBP_REJECT
ENDIF
RETURN (nRueck)
Ansonsten siehe in der Alaska Hilfe das Ereignis:
xbeP_Quit der XbpWindow()-Klasse an.
Gruß
Jürgen
wenn Du mit Express arbeitest, gibt es unter den GETOPTIONS
eine Option:
QUITQUERY MSG {||(schliessen()}
.
.
.
FUNCTION schliessen() //Wenn Windows beendet wird.
local nRueck:=0 //XBP_ALLOW, XBP_REJECT
IF abmeld() //Frage ob beendet werden soll
nRueck:=XBP_ALLOW
ELSE
nRueck:=XBP_REJECT
ENDIF
RETURN (nRueck)
Ansonsten siehe in der Alaska Hilfe das Ereignis:
xbeP_Quit der XbpWindow()-Klasse an.
Gruß
Jürgen
-
- Rekursionen-Architekt
- Beiträge: 194
- Registriert: Fr, 24. Feb 2006 8:09
- Kontaktdaten:
Guten Morgen,
Leider greift es eben nicht wenn der Prozess über den Task-Manager abgebrochen wird. Das steht auch so in der Doku
Bisher ist mir nur eine "Notloesung" eingefallen.
Prozess A startet beim Start einen Hilfsprozess B. Prozess B läuft nur um zu schauen ob Hauptprozess A läuft. Wird Prozess A "normal" beendet so beendet er vorher den Hilfsprozess B. Wird er über den Task-Manager abgebrochen, so wird der Hilfsprozess B nicht automatisch beendet, so dass dieser Hilfsprozess irgendwann merkt "Hauptprozess A ist nicht mehr da" und kann dann darauf reagieren.
Das gefällt mir aber deshalb nicht, weil der Hilfsprozess B ebenfalls über den Task-Manager abgebrochen werden könnte (oder kann ich diesen quasi unsichtbar starten?) Und außerdem bräuchte ich dann einen weiteren Prozess, der den Hilfsprozess "überwacht", und, und, und, ...
Deshalb hoffe ich dass vielleicht jem. Anderes 'ne bessere Idee hat ( ).
Gruß,
Notloesung
Das ist nicht der Fall.Juergen hat geschrieben:wenn Du mit Express arbeitest, gibt es unter den GETOPTIONS eine Option
Das habe ich bereits gemacht. Das xbeP_Quit Ereignis fange ich schon ab in der Hauptschleife abJuergen hat geschrieben:Ansonsten siehe in der Alaska Hilfe das Ereignis:
xbeP_Quit der XbpWindow()-Klasse an.
Code: Alles auswählen
DO WHILE .T.
nEvent := AppEvent( @mp1, @mp2, @oXbp )
oXbp:handleEvent( nEvent, mp1, mp2 )
IF nEvent == xbeP_Quit
_AppQuit( .T. )
ENDIF
ENDDO
Aber genau dieses Ereignis würde ich gerne abfangen wollen.Win32 - Auf Windows-Plattformen wird das xbeP_Quit Ereignis nur dann erzeugt, wenn das Betriebssystem heruntergefahren wird und der laufende Prozess vom Betriebssystem, nicht vom Anwender, beendet wird. Wenn ein Programm über den Task-Manager abgebrochen wird, entsteht ein xbeP_Close Ereignis.
Bisher ist mir nur eine "Notloesung" eingefallen.
Prozess A startet beim Start einen Hilfsprozess B. Prozess B läuft nur um zu schauen ob Hauptprozess A läuft. Wird Prozess A "normal" beendet so beendet er vorher den Hilfsprozess B. Wird er über den Task-Manager abgebrochen, so wird der Hilfsprozess B nicht automatisch beendet, so dass dieser Hilfsprozess irgendwann merkt "Hauptprozess A ist nicht mehr da" und kann dann darauf reagieren.
Das gefällt mir aber deshalb nicht, weil der Hilfsprozess B ebenfalls über den Task-Manager abgebrochen werden könnte (oder kann ich diesen quasi unsichtbar starten?) Und außerdem bräuchte ich dann einen weiteren Prozess, der den Hilfsprozess "überwacht", und, und, und, ...
Deshalb hoffe ich dass vielleicht jem. Anderes 'ne bessere Idee hat ( ).
Gruß,
Notloesung
- brandelh
- Foren-Moderator
- Beiträge: 15707
- Registriert: Mo, 23. Jan 2006 20:54
- Wohnort: Germersheim
- Hat sich bedankt: 71 Mal
- Danksagung erhalten: 38 Mal
- Kontaktdaten:
Hallo,
wenn es nur um die Anzeige geht, müsste man die destroy() Methode damit bestücken. Eigentlich sollte die dann eine Meldung liefern und die Kontrolle übernehmen.
Früher habe ich mal sowas mit Batchdateien realisiert. Die Batch hat das Programm gestartet und wenn es anders als gewünscht beendet wurde habe ich es gerade neu gestartet. Dafür habe ich teilweise TXT Dateien verwendet: Programm erstellt ENDE.OK und in Batchdatei:
könnte auch exist heißen ... oder ich setzte den Errorlevel auf 1 wenn das Ende erlaubt war:
Heute müsste es aber auch möglich sein, eine EXIT PROCEDURE zu verwenden, die wenn nötig mit RunShell() asyncron das gleiche Programm neu startet ...
wenn es nur um die Anzeige geht, müsste man die destroy() Methode damit bestücken. Eigentlich sollte die dann eine Meldung liefern und die Kontrolle übernehmen.
Früher habe ich mal sowas mit Batchdateien realisiert. Die Batch hat das Programm gestartet und wenn es anders als gewünscht beendet wurde habe ich es gerade neu gestartet. Dafür habe ich teilweise TXT Dateien verwendet: Programm erstellt ENDE.OK und in Batchdatei:
Code: Alles auswählen
if exists ENDE.OK goto ende
Programm starten...
Code: Alles auswählen
QUIT | CANCEL [<nErrorLevel>]
if errorlevel==1 goto ende
Gruß
Hubert
Hubert
- AUGE_OHR
- Marvin
- Beiträge: 12913
- Registriert: Do, 16. Mär 2006 7:55
- Wohnort: Hamburg
- Hat sich bedankt: 19 Mal
- Danksagung erhalten: 46 Mal
Re: Xbase-Anwendung über Task-Manager beenden
hi,
abschalten :
und setze (dword) auf 1.
gruss by OHR
Jimmy
du meinst also CRTL-ALT-DEL ? Du kannst den Taskmanager einfachnotloesung hat geschrieben: sondern vom User über den Task-Manager "abgeschossen" wird. (Prozess beenden)?
abschalten :
Code: Alles auswählen
HKCU\Software\Microsoft\Windows\CurrentVersion\Policies\System\DisableTaskMgr
gruss by OHR
Jimmy
-
- Rekursionen-Architekt
- Beiträge: 205
- Registriert: Mo, 07. Aug 2006 10:18
- Wohnort: Leipzig
- Danksagung erhalten: 11 Mal
Hallo Notloesung,
wie Du schon richtig bemerktest, wird ein xbeP_Close - Ereignis beim Beenden (auch über TaskManager) eines Dialogfensters ausgelöst.
Du musst also abfragen, ob für Dein Haupt-Dialog dieses Ereignis auftritt.
entweder:
oder:
Tschüs,
Sören
wie Du schon richtig bemerktest, wird ein xbeP_Close - Ereignis beim Beenden (auch über TaskManager) eines Dialogfensters ausgelöst.
Du musst also abfragen, ob für Dein Haupt-Dialog dieses Ereignis auftritt.
entweder:
Code: Alles auswählen
oAppDlg:close := { |uNIL1,uNIL2,o| App_Beenden() }
Code: Alles auswählen
WHILE .T.
nEvent := AppEvent( @mp1, @mp2, @oXbp )
oXbp:handleEvent( nEvent, mp1, mp2 )
IF nEvent == xbeP_Close .and. oXbp == oAppDlg
App_Beenden()
ENDIF
ENDDO
Sören
-
- Rekursionen-Architekt
- Beiträge: 315
- Registriert: Mo, 16. Okt 2006 13:04
- Wohnort: Region Stuttgart
Hallo Notloesung,
das Close-Ereignis liefert ja leider keinerlei Informationen über die Ursache. Es bleibt unklar, ob der Benutzer ein reguläres Close veranlasst hat oder ob der Prozess über den Taskmanager "abgeschossen" werden soll.
Die Idee mit dem Watchdog-Prozess ist doch gut. Wenn du diesen als Dienst implementierst ( ServiceApp() ), bleibt er für den Taskmanager in der Liste der Anwendungen unsichtbar. In der Liste der Prozesse kann er "in der Menge untertauchen" und ist nur für Eingeweihte erkennbar. Dienststart und Dienstbeendigung werden im Windows-eigenen Eventlog protokolliert, wenn ich nicht irre. Eventuell lässt sich über die Benutzerrechte steuern, ob der Dienst vom Benutzer beendet werden darf.
Um zu unterscheiden, ob die Anwendung "normal" oder via Taskmanager beendet worden ist, müssten dann allerdings die üblichen Wege zum Beenden des Programms über Alt+F4, Close-Box der Titelleiste und "Schließen"-Eintrag des Dialog-Systemmenüs gesperrt und durch einen selbst programmierten Close-Button ersetzt werden, der vor dem Schließen erst den Watchdog abschaltet.
Close-Box und "Schließen"-Eintrag im Systemmenü lassen sich über API-Aufrufe desaktivieren, wenn man nicht das Systemmenü insgesamt abschalten möchte.
Viele Grüße
Günter
das Close-Ereignis liefert ja leider keinerlei Informationen über die Ursache. Es bleibt unklar, ob der Benutzer ein reguläres Close veranlasst hat oder ob der Prozess über den Taskmanager "abgeschossen" werden soll.
Die Idee mit dem Watchdog-Prozess ist doch gut. Wenn du diesen als Dienst implementierst ( ServiceApp() ), bleibt er für den Taskmanager in der Liste der Anwendungen unsichtbar. In der Liste der Prozesse kann er "in der Menge untertauchen" und ist nur für Eingeweihte erkennbar. Dienststart und Dienstbeendigung werden im Windows-eigenen Eventlog protokolliert, wenn ich nicht irre. Eventuell lässt sich über die Benutzerrechte steuern, ob der Dienst vom Benutzer beendet werden darf.
Um zu unterscheiden, ob die Anwendung "normal" oder via Taskmanager beendet worden ist, müssten dann allerdings die üblichen Wege zum Beenden des Programms über Alt+F4, Close-Box der Titelleiste und "Schließen"-Eintrag des Dialog-Systemmenüs gesperrt und durch einen selbst programmierten Close-Button ersetzt werden, der vor dem Schließen erst den Watchdog abschaltet.
Close-Box und "Schließen"-Eintrag im Systemmenü lassen sich über API-Aufrufe desaktivieren, wenn man nicht das Systemmenü insgesamt abschalten möchte.
Viele Grüße
Günter
-
- Rekursionen-Architekt
- Beiträge: 194
- Registriert: Fr, 24. Feb 2006 8:09
- Kontaktdaten: