Form Close Button Clicked Event

  • VB.NET

Es gibt 23 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

    Form Close Button Clicked Event

    Hi,

    Wie kann man feststellen, ob eine Form tatsächlich deswegen geschlossen wird, weil auf das das X rechts oben geklickt wurde und nicht z.B. durch Code, wie Me.Close oder so. Und wenn das dann wirklich durch den Klick passiert ist, dann will ich das schließen noch aufhalten können.
    Was ich recherchiert hab:
    Spoiler anzeigen
    1. Form_Closing Event: Da kann man ja mit e.CloseReason feststellen, warum es geschlossen wird. Jedoch kommt beim Schließen Knopf und beim Aufruf von Me.Close als Reason: UserClosing raus
    2. Überschreiben von WndProc: Da kann ich es zwar abfangen, aber ich hab keine Möglichkeit gefunden, das Schließen zu verhindern... Mein Code dazu:

    VB.NET-Quellcode

    1. Protected Overrides Sub WndProc(ByRef m As System.Windows.Forms.Message)
    2. Const WM_SYSCOMMAND As Integer = &H112
    3. Const SC_CLOSE As Integer = &HF060 ' -> vbFormControlMenu
    4. If m.Msg = WM_SYSCOMMAND Then
    5. If m.WParam.ToInt32 = SC_CLOSE Then
    6. MsgBox("Durch den Schließen X Button Knopf Dings")
    7. End If
    8. End If
    9. MyBase.WndProc(m)
    10. End Sub
    Wie wäre es mit dem Form_Closed Event?
    Mfg: Gather
    Private Nachrichten bezüglich VB-Fragen werden Ignoriert!


    Artentus schrieb:

    Also bei der Variante mit Wndproc: wenn dus schon geschafft hast, es abzufragen, dann solltest du es eigentlich verhindern können, indem du nicht mehr Wndproc der Basisklasse aufrufst.
    Optimalst :D Danke, soweit hab ich wieder nicht gedacht :D
    so guckts jetzt aus:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Protected Overrides Sub WndProc(ByRef m As System.Windows.Forms.Message)
    2. Const WM_SYSCOMMAND As Integer = &H112 ' WM_SYSCOMMAND+SC_CLOSE ->
    3. Const SC_CLOSE As Integer = &HF060 ' -> vbFormControlMenu
    4. If m.Msg = WM_SYSCOMMAND Then
    5. If m.WParam.ToInt32 = SC_CLOSE Then
    6. 'X-Button
    7. Dim Res As MsgBoxResult = MsgBox("Wollen Sie das Programm wirklich beenden [ja] oder minimieren [nein]?", MsgBoxStyle.YesNoCancel)
    8. If Res = MsgBoxResult.Yes Then
    9. MyBase.WndProc(m)
    10. ElseIf Res = MsgBoxResult.No Then
    11. Me.Hide()
    12. ElseIf Res = MsgBoxResult.Cancel Then
    13. End If
    14. Else
    15. MyBase.WndProc(m)
    16. End If
    17. Else
    18. MyBase.WndProc(m)
    19. End If
    20. End Sub

    Spoiler anzeigen

    Gather schrieb:

    Wie wäre es mit dem Form_Closed Event?
    Dann kann man glaub ich das Schließen nicht mehr aufhalten, außer man startet das Fenster neu...

    ErfinderDesRades schrieb:

    oder malwieder einen vorsichtigen Blick in den ObjectBrowser... vlt. die FormClosingEventArgs angugge (aber auch die Basisklasse) - es lohnt sich!
    Ich will nicht unhöflich sein, aber: Ich hab mir extra wegen dir die Mühe gemacht und mich vorher relativ allumfassend informiert. Ich habe oben erklärt, warum ich wahrscheinlich mit diesem Ereignis nichts anfangen kann. Natürlich lass ich mich gerne eines Besseren belehren, aber nur, wenn das wirklich was zum Thema tut. Vlt. die Fragestellungen angugge (aber auch die Expander) - auch wenn du ungefähr jeden Tag hunderte Fragen beantwortest, wofür ich dir dankbar bin. Wobei ich von dir fast nur Aufforderungen zum selber recherchieren gefunden hab. Da frag ich mich halt, wofür es dieses Forum überhaupt gibt...
    Buh - vorgesagt!

    Nun hatter wieder die Chance verpasst, zu erleben, wie man die mitgelieferte Doku liest, und in 10s die Lösung finden kann, sogar ohne Internet.

    Ich hätte ihn jetzt aufgefordert, Screenshot vom ObjectBrowser zu posten. Weil er behauptet, er habe damit die FormClosingEventArgs schon angeguckt, und sei ihm nichts aufgefallen.

    Und das kann garnicht stimmen, denn wenner den Screenshot lieferte, würde ers selbst sehen müssen.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „ErfinderDesRades“ ()

    Dann setz ein Flag, wenn es mit nem Button o. ä. geschlossen wird und im FormClosing-EventHandler prüfst Du dann, ob Flag gesetzt. Wo ists Problem? Was @ErfinderDesRades: meinte, er soll sich die EventArgs mal ansehen, um das Schliessen zu unterbinden, das war nämlich seine Frage.
    Die Unendlichkeit ist weit. Vor allem gegen Ende. ?(
    Manche Menschen sind gar nicht dumm. Sie haben nur Pech beim Denken. 8o
    @ErfinderDesRades: Wenn man sich die Posts des TE´s so ansieht, dann glaube ich schon, dass er weiß, was der ObjectBrowser ist. Jedenfalls ist das mein Eindruck.
    Die Unendlichkeit ist weit. Vor allem gegen Ende. ?(
    Manche Menschen sind gar nicht dumm. Sie haben nur Pech beim Denken. 8o
    HA! TRIUMPH :D

    Aber jetzt würde mich trdm interessieren, was ich finden hätte sollen... weil CloseReason hab ich ja schon erwähnt...
    Form_Closing Event: Da kann man ja mit e.CloseReason feststellen, warum es geschlossen wird. Jedoch kommt beim Schließen Knopf und beim Aufruf von Me.Close als Reason: UserClosing raus

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Sederic Enders“ ()

    Sederic Enders schrieb:

    weil CloseReason hab ich ja schon erwähnt...
    Ja und?
    Glaubst Du, über WM_CLOSE bekommst Du weitergehende Informationen als über CloseReason?
    Welche Optionen bietet denn das Enum noch?
    Wenn Du das Programm im Studio (Debugger) startest und im Studio abschießt, kommr er da gar nicht nicht vorbei.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Was macht es denn für einen Unterschied, ob der User das "X" oder nen Button nutzt, um das Programm zu beenden. UserClosing ist UserClosing. Was ist nun, wenn er es über die Taskleiste über das Contextmenü beendet? Soll das auch extra behandelt werden? Wenn der User Dein Programm über den Taskmanager abschießt, dann bekommst Du das nicht mal gemeldet, obwohl in diesem Fall auch UserClosing vorliegt. Ich denke, man sollte sich hier nicht versteifen.

    @Sederic Enders:

    Aber zu Deiner Frage. Ja, es ist möglich, den Klick auf das "X" festzustellen. Schau Dir dazu mal das an:

    VB.NET-Quellcode

    1. Private Const WM_NCLBUTTONDOWN As Integer = &HA1
    2. Private Const HTCLOSE As Integer = &H14


    Das ist mein Tip für Dich. Ich glaub, den Rest bekommst Du selber hin.
    Die Unendlichkeit ist weit. Vor allem gegen Ende. ?(
    Manche Menschen sind gar nicht dumm. Sie haben nur Pech beim Denken. 8o
    @SpaceyX: Sehr nett, dass du als einziger so höflich bist und wenigstens ansatzweiße versuchst mir ne Lösung zu zeigen oder mir euer gesumpse zu erklären, während die anderen sich nur lustig drüber machen, wie unfähig ich bin...
    Aber nun zum Thema:
    Also jetzt doch mit WndProc oder wie!?!
    Hört mir eigentlich jemand in diesem Forum zu????
    Ich verweiße auf Beitrag Nr. 5 in dem ich erklärt habe, dass ich eine Lösung mit WndProc gefunden habe, zwar anders, als SpaceyX geagt hat, jedoch funktionierts und ich muss nicht noch ewig nach der Lösung des Rätsels suchen, was ich jetzt mit diesen 2 Konstanten soll...
    Ich würd sagen das Thema ist erledigt... seit 14 Beiträgen