Discussion:
Versehentliches Access Schließen verhindern / Subclassing
(zu alt für eine Antwort)
Bernd Ludwig
2005-07-20 06:59:42 UTC
Permalink
Hallo,

ich möchte vor dem Beenden meiner Access DB den Benutzer fragen ob er dies
wirklich will.
Diese Frage soll aber nur gestellt werden wenn er auf das X in der rechten
Ecke im Anwendungsfenster geklickt hat. Die Frage soll nicht erscheinen wenn
der Benutzer Windows beenden möchte.

Die Variable ENDSESSION wird niemals wahr.
Hier mein Code im Modul:

Global ENDSESSION As Boolean

Public Function WindowProc(ByVal hWnd As Long, ByVal uMsg As Long, ByVal
wParam As Long, ByVal lParam As Long) As Long
If uMsg = WM_QUERYENDSESSION Then
ENDSESSION = True
End If
WindowProc = CallWindowProc(PrevWindowProc, hWnd, uMsg, wParam, lParam)
End Function

Public Sub UnsubClass(hWnd As Long)
If PrevWindowProc <> 0 Then
Call SetWindowLong(hWnd, GWL_WNDPROC, PrevWindowProc)
PrevWindowProc = 0
End If
End Sub

Public Sub SubClass(hWnd As Long)
ENDSESSION = False
PrevWindowProc = SetWindowLong(hWnd, GWL_WNDPROC, AddressOf WindowProc)
End Sub


Und dies ist der Code im Formular:
Private Sub Form_Close()
UnsubClass Me.hWnd
End Sub

Private Sub Form_Open(Cancel As Integer)
SubClass Me.hWnd
End Sub

Private Sub Form_Unload(Cancel As Integer)
If Not ENDSESSION Then
If MsgBox("Beenden?", vbYesNo) = vbNo Then
Cancel = True
End If
End If
End Sub


Besten Dank für Tipps! Auf Wunsch könnte ich hier auch die MDB posten.
stefan hoffmann
2005-07-20 09:36:31 UTC
Permalink
tach Bernd,
Post by Bernd Ludwig
Die Variable ENDSESSION wird niemals wahr.
If uMsg = WM_QUERYENDSESSION Then
Siehe MSDN Library:
The WM_QUERYENDSESSION message is sent when the user chooses to end the
session or when an application calls the ExitWindows function.

Auf deutsch: Wenn der Benutzer sich ausloggt oder Windows beendet oder
neu gestartet werden soll.


mfG
--> stefan <--
--
Access-FAQ http://www.donkarl.com/
KnowHow.mdb http://www.freeaccess.de
Newbie-Info http://www.doerbandt.de/Access/Newbie.htm
Jörg Ostendorp
2005-07-20 10:40:37 UTC
Permalink
Hallo Bernd,
Post by Bernd Ludwig
Hallo,
ich möchte vor dem Beenden meiner Access DB den Benutzer fragen ob er dies
wirklich will.
Diese Frage soll aber nur gestellt werden wenn er auf das X in der rechten
Ecke im Anwendungsfenster geklickt hat. Die Frage soll nicht erscheinen wenn
der Benutzer Windows beenden möchte.
[Code geschnibbelt]

Schau Dir mal die WM_SYCOMMAND-Message an, die liefert Dir beim Schließen
übers Kreuz im wparam einen entsprechenden Wert (SC_CLOSE).
BTW: Da Du, wie Du schreibst, das Schließen der /Anwendung/ verhindern
willst, müßtest Du auch tatsächlich die Anwendung subclassen und nicht das
Formular.

Viele Grüße
Jörg Ostendorp
Jörg Ackermann
2005-07-21 07:02:02 UTC
Permalink
Hi,
Post by Jörg Ostendorp
BTW: Da Du, wie Du schreibst, das Schließen der /Anwendung/ verhindern
willst, müßtest Du auch tatsächlich die Anwendung subclassen und
nicht das Formular.
Genau.

Das sollte laufen:

------------------------------------------------------------
The whole (should working) Story:

Option Explicit

Global ENDSESSION As Boolean

Private Declare Function CallWindowProc Lib "user32" _
Alias "CallWindowProcA" _
(ByVal lpPrevWndFunc As Long, _
ByVal hWnd As Long, _
ByVal msg As Long, _
ByVal wParam As Long, _
ByVal lParam As Long) _
As Long

Private Declare Function SetWindowLong Lib "user32" _
Alias "SetWindowLongA" _
(ByVal hWnd As Long, _
ByVal NIndex As Long, _
ByVal wNewWord As Long) _
As Long

Private Declare Function GetWindowLong Lib "user32" _
Alias "GetWindowLongA" _
(ByVal hWnd As Long, _
ByVal NIndex As Long) _
As Long

Private Const GWL_WNDPROC As Long = (-4)
Private Const WM_QUERYENDSESSION = &H11

Private PrevWindowProc As Long

Public Function WindowProc(ByVal hWnd As Long, ByVal uMsg As Long, _
ByVal wParam As Long, ByVal lParam As Long) As Long

Select Case uMsg
Case WM_QUERYENDSESSION
If wParam <> 0 Then
Else
'Msgbox "WM_QUERYENDSESSION message received"
ENDSESSION = True
End If
End Select
WindowProc = CallWindowProc(PrevWindowProc, hWnd, uMsg, wParam, lParam)
End Function

Public Sub UnsubClass(hWnd As Long)
If PrevWindowProc <> 0 Then
Call SetWindowLong(hWnd, GWL_WNDPROC, PrevWindowProc)
PrevWindowProc = 0
End If
End Sub

Public Sub SubClass(hWnd As Long)
ENDSESSION = False
PrevWindowProc = SetWindowLong(hWnd, GWL_WNDPROC, AddressOf WindowProc)
End Sub

--------------------------------------------------------------

Private Sub Form_Close()
UnsubClass Application.hWndAccessApp
End Sub

Private Sub Form_Open(Cancel As Integer)
SubClass Application.hWndAccessApp
End Sub

Private Sub Form_Unload(Cancel As Integer)
If Not ENDSESSION Then
If MsgBox("Close Application?", vbYesNo) = vbNo Then
Cancel = True
End If
End If
End Sub
--------------------------------------------------------------
Bernd Ludwig
2005-07-21 07:34:14 UTC
Permalink
Hallo liebe Access Interessierte,

erstmals herzlichen Dank euch Allen, insbesondere dem Jörg!

Leider funktioniert das alles immer noch nicht so wie gewünscht.

Vielleicht habe ich mich auch doch zu ungenau ausgedrückt:
Ich möchte dass wenn der Benutzer auf Start / Abmelden oder Start /
Ausschalten klickt meine Access Anwendung endet. Nur wenn der Benutzer
Alt+F4 oder auf das X rechts oben klickt soll die Frage kommen ob er
wirklich beenden möchte.

Der Code von Jörg funktioniert wie folgt: Wenn der Benutzer das Formular
schließt kommt die Frage. Wenn er aber mit Alt+F4 beendet kommt keine Frage.
Das ist leider nicht was ich möchte. Was passiert wenn man Start / Abmelden
klickt habe ich gar nicht erst ausprobiert.

Grüße Bernd

Peter Doering
2005-07-20 11:19:24 UTC
Permalink
Hallo,
Post by Bernd Ludwig
ich möchte vor dem Beenden meiner Access DB den Benutzer fragen ob er dies
wirklich will.
Diese Frage soll aber nur gestellt werden wenn er auf das X in der rechten
Ecke im Anwendungsfenster geklickt hat. Die Frage soll nicht erscheinen wenn
der Benutzer Windows beenden möchte.
Geht auch mit Bordmitteln, siehe FAQ 1.12 (www.donkarl.com).

Gruss - Peter
--
Ich beantworte keine Fragen per Email.
Mitglied im http://www.dbdev.org
FAQ: http://www.donkarl.com
Jörg Ostendorp
2005-07-20 11:33:45 UTC
Permalink
Hallo Peter,
Post by Peter Doering
Post by Bernd Ludwig
ich möchte vor dem Beenden meiner Access DB den Benutzer fragen ob er dies
wirklich will.
Diese Frage soll aber nur gestellt werden wenn er auf das X in der rechten
Ecke im Anwendungsfenster geklickt hat. Die Frage soll nicht erscheinen wenn
der Benutzer Windows beenden möchte.
Geht auch mit Bordmitteln, siehe FAQ 1.12 (www.donkarl.com).
Und wie teilst Du dem Kontrollkästchen mit Boardmitteln mit, daß es beim
Beenden von Windows den Wert true annehmen soll? ;-)

Viele Grüße
Jörg Ostendorp
Jörg Ackermann
2005-07-20 11:46:10 UTC
Permalink
Hi,
Post by Jörg Ostendorp
Und wie teilst Du dem Kontrollkästchen mit Boardmitteln mit, daß es
beim Beenden von Windows den Wert true annehmen soll? ;-)
Mit o.g. Hook latürnich
<duck und weg>

Gruß
Stefan Wirrer
2005-07-20 11:21:49 UTC
Permalink
Hallo Bernd,
Post by Bernd Ludwig
ich möchte vor dem Beenden meiner Access DB den Benutzer fragen ob er
dies wirklich will.
FAQ ' Schließen der Datenbank verhindern' ;-)
--
Gruß
aus München

Stefan

***@volke-muc.de
---------------------------------------------------------------------
KnowHow-MDB: http://www.freeaccess.de/
Access-FAQ: http://www.donkarl.com/AccessFAQ.htm
Infos für Neulinge in den Access-Newsgroups:
http://www.doerbandt.de/access/Newbie.htm
Loading...