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" :lol: 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

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:

Code: Alles auswählen

if exists ENDE.OK goto ende
Programm starten...
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:

Code: Alles auswählen

oAppDlg:close := {  |uNIL1,uNIL2,o| App_Beenden() }
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