![]() |
Warum klappt Abmeldung bei laufendem Programm nicht?
Der ein oder andere kennt vielleicht mein Programm
![]() 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:
Das verwende ich, um zu bewirken, dass das Programm bei einem Klick auf das X versteckt wird.
void MainFormClosing(object sender, System.ComponentModel.CancelEventArgs e)
{ e.Cancel = true; Hide(); } 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! |
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:
|
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 ;) |
Re: Warum klappt Abmeldung bei laufendem Programm nicht?
Zitat:
|
Re: Warum klappt Abmeldung bei laufendem Programm nicht?
Zitat:
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: |
Re: Warum klappt Abmeldung bei laufendem Programm nicht?
Zitat:
|
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. |
Re: Warum klappt Abmeldung bei laufendem Programm nicht?
Zitat:
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). |
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? |
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. |
Re: Warum klappt Abmeldung bei laufendem Programm nicht?
Zitat:
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); } |
Re: Warum klappt Abmeldung bei laufendem Programm nicht?
@Khabarakh: :lol: Genau das hab ich vermutet :)
|
Re: Warum klappt Abmeldung bei laufendem Programm nicht?
Zitat:
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 |
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: |
Re: Warum klappt Abmeldung bei laufendem Programm nicht?
Zitat:
Zitat:
Ansonsten Versuch doch mal meinen Vorschlag und nimm' WM_ENDSESSION :wink: |
Re: Warum klappt Abmeldung bei laufendem Programm nicht?
Zitat:
Delphi-Quellcode:
enthält...
e.Cancel = false;
|
Re: Warum klappt Abmeldung bei laufendem Programm nicht?
Zitat:
Code:
benutzen. Sollte nun wirklich funktionieren, da es so sogar im MSDN zu finden ist ;) .
e.Cancel = !shuttingDown;
|
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 |
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:
So funktioniert das ganz gut :)
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); } Danke an alle! |
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:27 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz