Seite 1 von 1
Xbase-Anwendung über Task-Manager beenden
Verfasst: Mi, 08. Aug 2007 10:14
von notloesung
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
Verfasst: Do, 09. Aug 2007 19:39
von Juergen
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
Verfasst: Fr, 10. Aug 2007 7:35
von notloesung
Guten Morgen,
Juergen hat geschrieben:wenn Du mit Express arbeitest, gibt es unter den GETOPTIONS eine Option
Das ist nicht der Fall.
Juergen hat geschrieben:Ansonsten siehe in der Alaska Hilfe das Ereignis:
xbeP_Quit der XbpWindow()-Klasse an.
Das habe ich bereits gemacht. Das xbeP_Quit Ereignis fange ich schon ab in der Hauptschleife ab
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
Leider greift es eben nicht wenn der Prozess über den Task-Manager abgebrochen wird. Das steht auch so in der Doku
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.
Aber genau dieses Ereignis würde ich gerne abfangen wollen.
Bisher ist mir nur eine "Notloesung"
![Laughing :lol:](./images/smilies/lol.gif)
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 (
![Question :?:](./images/smilies/question.gif)
).
Gruß,
Notloesung
Verfasst: Fr, 10. Aug 2007 10:38
von brandelh
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:
Code: Alles auswählen
QUIT | CANCEL [<nErrorLevel>]
if errorlevel==1 goto ende
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 ...
Re: Xbase-Anwendung über Task-Manager beenden
Verfasst: Fr, 10. Aug 2007 17:32
von AUGE_OHR
hi,
notloesung hat geschrieben:
sondern vom User über den Task-Manager "abgeschossen" wird. (Prozess beenden)?
du meinst also CRTL-ALT-DEL ? Du kannst den Taskmanager einfach
abschalten :
Code: Alles auswählen
HKCU\Software\Microsoft\Windows\CurrentVersion\Policies\System\DisableTaskMgr
und setze (dword) auf 1.
gruss by OHR
Jimmy
Verfasst: Fr, 10. Aug 2007 19:27
von Sören
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:
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
Tschüs,
Sören
Verfasst: Sa, 11. Aug 2007 9:32
von Günter Beyes
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
Verfasst: Di, 14. Aug 2007 7:15
von notloesung
Guten Morgen,
danke für die Tipps und Lösungsansätze.
Ich werde mal "basteln" und mein Ergebnis dann posten.
(Wird ein wenig dauern, bin gerade am etwas anderem dran.)
Gruß,
Notloesung