Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   C# Warum klappt Abmeldung bei laufendem Programm nicht? (https://www.delphipraxis.net/75957-warum-klappt-abmeldung-bei-laufendem-programm-nicht.html)

Chewie 27. Aug 2006 20:48


Warum klappt Abmeldung bei laufendem Programm nicht?
 
Der ein oder andere kennt vielleicht mein Programm RunAs-Tray.

Ich hab nun herausgefunden, dass Windows sich nicht mehr abmelden kann, wenn das Programm läuft. Ich weiß aber nicht, was ich machen könnte, was das Abmelden verhindert.

Das einzige, was ich mir vorstellen könnte, dass es damit zu tun hat, ist folgender Ereignishandler:

Code:
void MainFormClosing(object sender, System.ComponentModel.CancelEventArgs e)
      {
         e.Cancel = true;
         Hide();
      }
Das verwende ich, um zu bewirken, dass das Programm bei einem Klick auf das X versteckt wird.

Ist das der Grund oder hat jemand sonst eine Idee, woran das liegen könnte? Der Code ist im Archiv enthalten, falls jemand drüberkucken will.


Danke schonmal!

Daniel G 27. Aug 2006 21:23

Re: Warum klappt Abmeldung bei laufendem Programm nicht?
 
Ich muss im Voraus sagen, dass ich C# nicht wirklich kann. Allerdings würde ich an deiner Stelle dann vielleicht auf die WM_ENDSESSION - Nachricht reagieren.

Zitat:

The WM_ENDSESSION message is sent to an application after the system processes the results of the WM_QUERYENDSESSION message. The WM_ENDSESSION message informs the application whether the session is ending.
Denn mit deinem Befehl verhinderst du ja, dass dein Programm regulär beendet werden kann

DGL-luke 27. Aug 2006 21:33

Re: Warum klappt Abmeldung bei laufendem Programm nicht?
 
Ist bei den Argumenten ein Hinweis azuf den Schließungsgrund drin? Der z.B. aufs Herunterfahren von Windows hinweist?

@Daniel G: Ja, genau das, aber auf nachrichten reagieren ist in C# meist der unschönere Ansatz ;)

Luckie 27. Aug 2006 21:36

Re: Warum klappt Abmeldung bei laufendem Programm nicht?
 
Zitat:

Zitat von DGL-luke
@Daniel G: Ja, genau das, aber auf nachrichten reagieren ist in C# meist der unschönere Ansatz ;)

So kange Windows auf Nachrcihten basiert, wirst du nicht da drumrumkommen.

Daniel G 27. Aug 2006 21:40

Re: Warum klappt Abmeldung bei laufendem Programm nicht?
 
Zitat:

Zitat von DGL-luke
@Daniel G: Ja, genau das, aber auf nachrichten reagieren ist in C# meist der unschönere Ansatz ;)

:shock:

Was ist das denn für eine Sprache, bei der das Verarbeiten von Systemnachrichten ein "unschöner Ansatz" ist? In meinen (nicht - C#) - Augen ist das die einzige sinnvolle Lösung... :gruebel:

Chewie 27. Aug 2006 21:49

Re: Warum klappt Abmeldung bei laufendem Programm nicht?
 
Zitat:

Zitat von DGL-luke
Ist bei den Argumenten ein Hinweis azuf den Schließungsgrund drin? Der z.B. aufs Herunterfahren von Windows hinweist?

Leider nicht. Neben Cancel sind in den Event-Args nur Standardsachen wie ToString etc. drin :?

DGL-luke 27. Aug 2006 21:53

Re: Warum klappt Abmeldung bei laufendem Programm nicht?
 
@Daniel G / Luckie: :shock: Naja, immerhin ist C# fürs .Net-Framework gebaut. Und das ist ein Framework, sollte einem die WinAPI-Arbeit also komplett abnehmen. Dazu gehört auch das Reagieren auf Windows-Nachrichten. Wenn sich das System beendet, sollte das Framework das eben z.B. per Event ans progamm melden - indem es das im MainFormClosing angibt.

Und wenn es keine andere Lösung gibt, muss man halt auf Nachrichten reagieren, das ist aber dann ein Designfehler im .Net-Framework.

Daniel G 27. Aug 2006 21:55

Re: Warum klappt Abmeldung bei laufendem Programm nicht?
 
Zitat:

Zitat von DGL-luke
@Daniel G / Luckie: :shock: Naja, immerhin ist C# fürs .Net-Framework gebaut.

*Nicht gewusst hat'* :stupid:

Wie gesagt, ich kenne mich mit C# nicht aus, aber das wäre die Standard - Prozedur für mich in Win32 - Delphi (und C/C++ sicher auch).

Chewie 27. Aug 2006 21:59

Re: Warum klappt Abmeldung bei laufendem Programm nicht?
 
Ich denke nicht, dass das der einzige (und damit beste) Weg ist, denn eine Applikation statt zu schließen nur zu verstecken und ein Tray-Symbol anzeigen sollte doch nicht außergewöhnliches sein, oder?

Vermutlich muss ich die Ereignisbehandlung anders bewerkstelligen, nur wie?

DGL-luke 27. Aug 2006 21:59

Re: Warum klappt Abmeldung bei laufendem Programm nicht?
 
@Daniel G: Ja, is klar.

Aber z.B. in Linux wirst du die Möglichkeit nicht haben, mal eben einen nachrichtenpoller zu bauen.... was allerdings afaik in .Net möglich ist, Mono etc. werden das wohl emulieren.

@Chewie: Wie bereits gesagt, es ist möglich, du kannst die Nachrichtenschleife anpieksen. Wie genau kann ich dir jetzt nicht sagen.

Khabarakh 27. Aug 2006 22:03

Re: Warum klappt Abmeldung bei laufendem Programm nicht?
 
Zitat:

Zitat von DGL-luke
Ist bei den Argumenten ein Hinweis azuf den Schließungsgrund drin? Der z.B. aufs Herunterfahren von Windows hinweist?

Jupp. Allerdings erst unter .Net 2.0 :mrgreen: .
Wer also immer noch 1.1 benutzt, wird wohl um die Botschaftsmehtoden nicht herumkommen:
Code:
const int WM_QUERYENDSESSION = 0x11;

protected override void WndProc(ref Message m)
{
    if (m.Msg == WM_QUERYENDSESSION)
        Application.Exit(); // sollte unter 1.1 noch kein (Form)Closing Event aufrufen
base.WndProc(ref m);
}

DGL-luke 27. Aug 2006 22:05

Re: Warum klappt Abmeldung bei laufendem Programm nicht?
 
@Khabarakh: :lol: Genau das hab ich vermutet :)

lizardking 27. Aug 2006 22:09

Re: Warum klappt Abmeldung bei laufendem Programm nicht?
 
Zitat:

Zitat von DGL-luke
@Daniel G / Luckie: :shock: Naja, immerhin ist C# fürs .Net-Framework gebaut. Und das ist ein Framework, sollte einem die WinAPI-Arbeit also komplett abnehmen. Dazu gehört auch das Reagieren auf Windows-Nachrichten. Wenn sich das System beendet, sollte das Framework das eben z.B. per Event ans progamm melden - indem es das im MainFormClosing angibt.

Das sollte in der Tat so sein und wird auch so sein (sonst wuerde ja jede C#-Anwendung dieses Problem haben. Kann es sein, dass Du sonst irgendwo im Programm Messages verarbeitest und da aus Versehen die entsprechenden einfach "auffrisst" ?
Sowas hatte ich naemlich auch schonmal ;-) Immer fleissig Window-Messages abgefangen und nachgeschaut, ob es die erwartete ist und wenn nicht einfach weggeworfen anstatt weiterzuleiten.

Ist nur 'ne Idee...

Gruesse,

Lizzy

Chewie 27. Aug 2006 22:20

Re: Warum klappt Abmeldung bei laufendem Programm nicht?
 
Bisher hab ich noch keine Messages aufgefangen, ich werd den Vorschlag von Khabarakh verwenden. Er klingt so wissend, also wirds stimmen :D

Jetzt passiert was lustiges: Das Programm wird zwar beendet, der Abmeldevorgang aber unterbrochen. Wenn ich dann ein zweites mal den Befehl zum Abmelden geb, wird er durchgeführt :shock:

Daniel G 27. Aug 2006 22:25

Re: Warum klappt Abmeldung bei laufendem Programm nicht?
 
Zitat:

Zitat von Chewie
Jetzt passiert was lustiges: Das Programm wird zwar beendet, der Abmeldevorgang aber unterbrochen. Wenn ich dann ein zweites mal den Befehl zum Abmelden geb, wird er durchgeführt :shock:

Zitat:

Return Values
If an application can terminate conveniently, it should return TRUE; otherwise, it should return FALSE.
Was gibt's du denn zurück? :stupid:

Ansonsten Versuch doch mal meinen Vorschlag und nimm' WM_ENDSESSION :wink:

DGL-luke 27. Aug 2006 22:28

Re: Warum klappt Abmeldung bei laufendem Programm nicht?
 
Zitat:

Zitat von lizardking
sonst wuerde ja jede C#-Anwendung dieses Problem haben.

Ne..... weil nicht jede
Delphi-Quellcode:
e.Cancel = false;
enthält...

Khabarakh 27. Aug 2006 22:36

Re: Warum klappt Abmeldung bei laufendem Programm nicht?
 
Zitat:

Zitat von Chewie
Jetzt passiert was lustiges: Das Programm wird zwar beendet, der Abmeldevorgang aber unterbrochen. Wenn ich dann ein zweites mal den Befehl zum Abmelden geb, wird er durchgeführt :shock:

Nett :mrgreen: . Aber mir fällt gerade auf, dass man das Programm sowieso lieber nicht in QUERYSESSION schließen sollte. Setze also stattdessen lieber ein "Shutting Down"-Flag, in Closing kannst du dann
Code:
e.Cancel = !shuttingDown;
benutzen. Sollte nun wirklich funktionieren, da es so sogar im MSDN zu finden ist ;) .

Chewie 27. Aug 2006 22:47

Re: Warum klappt Abmeldung bei laufendem Programm nicht?
 
Ja, das ist ne gute Idee. Probier ich morgen mal, für heute ist mein VS zu müde ;)

Danke für die Antworten. Und probiert das Programm mal aus und gebt Feedback :D

Chewie 28. Aug 2006 13:03

Re: Warum klappt Abmeldung bei laufendem Programm nicht?
 
So, ich habs jetzt so gemacht, wie Khabarakh vorgeschlagen hat, mit dem Shutdown-Flag. Zu Sicherheit wird auch noch eine 1 zurückgegeben in der Fensterprozedur (auch wenn das durch den Basisaufruf ohnehin passieren sollte, aber sicher ist sicher).

Code:
const int WM_QUERYENDSESSION = 0x11;

      protected override void WndProc(ref Message m)
      {
         if (m.Msg == WM_QUERYENDSESSION) {
            m.Result = new IntPtr(1); // signal windows to proceed
            endSession = true; // set flag that closing of form shouldn't be declined
         }
         base.WndProc(ref m);
      }
So funktioniert das ganz gut :)

Danke an alle!


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:11 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz