wzf_sky
СˮÊÖ

UID 617
¾«»ª
0
»ý·Ö 11
Ìû×Ó 11
ÔĶÁȨÏÞ 10
×¢²á 2005-10-1 À´×Ô ¹ã¶«
״̬ ÀëÏß
|
Ôڹػú»òLogffǰÐÅÏ¢µÄÀ¹½Ø
Ôڹػú»òLogffǰÐÅÏ¢µÄÀ¹½Ø
Èç¹ûÎÒÃǹػú»òLogoffʱ£¬ÎÒÃǵijÌÐòÓÐʱ»áÒò¶øÎÞ·¨°´Õý³£³ÌÐò½áÊø£¬Ò»°ãÎÒÃÇ»áÔÚ
FormµÄUnloadÖÐÒ»¶Î³ÌÐò½áÊøÊ±Òª×öʲôÊ£¬µ«ÊÇ£¬Èç¹ûʹÓÃÕßÖ±½ÓÓÿªÊ¼¹¦Äܲ˵¥µÄ¹Ø
»ú£¬»áʹUnLoadµÄ²¿·ÝûÓÐ×öµ½£¬ÎÒÃÇÏÖÔÚ¾ÍÏë°ì·¨À´À¹½Ø¹Ø»ú(»òLogoff)ʱµÄÐÅÏ¢¡£
Ò»°ãÀ´Ëµ£¬¹Ø»ú»òLogffºó£¬Windows»á´«ÒÀÐòËͳöWM_QUERYENDSESSIONµÄÐÅÏ¢¸øÃ¿¸ö
Process£¬Èç¹ûÖмäÓÐÒ»¸öProcess²»ÄÜ˳Àû½áÊø(ÀýÈ磺WordÐ޸ĺóδ´æµµ£¬¶ø³öÏÖÊÇ
·ñ´æµµ£¬µ«ÎÒÃǰ´È¡Ïû)£¬Õâʱ¸ÃÐÅÏ¢Ö´ÐеĽá¹û»á´«»ØFalse(0)£¬ÕâʱWindowsÒ²¾Í
²»ÔÙ¼ÌÐøËÍWM_QUERYENDSESSION¸øÏÂÒ»¸öProccess¡£·´Ö®£¬Èç¹ûËùÓеÄProcess¶¼¿ÉÒÔ
˳Àû½áÊø(Ò²¾ÍÊÇÿ¸öËͳöµÄWM_QUERYENDSESSION¶¼´«»ØTrue)£¬ÄDzŴú±íÒÔÒÔ˳Àû½áÊø¡£
²»¹ÜWM_QUERYENDSESSION×îºóµÄ½á¹ûÊÇ¿ÉÒÔ˳Àû½áÊø»ò²»ÄÜ˳Àû½áÊø£¬Windows»áÔÙËÍ
Ò»¸öWM_ENDSESSIONµÄÐÅÏ¢¸øËùÓеÄProcess£¬¶øwParamµÄÄÚÈݱãÊÇÖ¸³öÊÇ·ñ¿ÉÒÔ˳Àû
½áÊø(True²Ëµ¥¿ÉÒÔ£¬False²Ëµ¥²»ÐУ¬ÔÚvbÖÐÔòCheck wParam = 0 ²Ëµ¥False £¬ 0²Ëµ¥True)
£¬Ëµµ½ÕâÀï´ó¸Å¾ÍÖªµÀ¸ÃÈçºÎ×öÀ²£¬³ÌÐòÈçÏ£º
'ÒÔÏÂÔÚForm
Private Sub Form_Load()
Dim ret As Long
'¼Ç¼ÔÀ´µÄWindow ProcedureµÄλַ
preWinProc = GetWindowLong(Me.hwnd, GWL_WNDPROC)
'É趨formµÄwindow Procedureµ½wndproc
ret = SetWindowLong(Me.hwnd, GWL_WNDPROC, AddressOf wndproc)
End Sub
Private Sub Form_Unload(Cancel As Integer)
Dim ret As Long
'È¡ÏûMessageµÄ½ØÈ¡£¬¶øÊ¹Ö®ÓÖÖ»ËÍÍùÔÀ´µÄWindow Procedure
ret = SetWindowLong(Me.hwnd, GWL_WNDPROC, preWinProc)
'ÕâÀïÖ»ÊÇÒª¿´¿´ÓùػúµÄ·½Ê½½áÊø³ÌÐòʱ£¬»á²»»áÖ´Ðе½ÕâÀï
Dim fno As Long
fno = FreeFile
Open "c:\tt2" For Append As fno
Print #fno, "ccc" + vbCrLf
Close #fno
End Sub
'ÒÔÏÂÔÚ.Bas
Option Explicit
Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" _
(ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" _
(ByVal hwnd As Long, ByVal nIndex As Long) As Long
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
Public Const GWL_WNDPROC = (-4)
Public Const WM_ENDSESSION = &H16
Public Const WM_QUERYENDSESSION = &H11
Public preWinProc As Long
Public Function wndproc(ByVal hwnd As Long, ByVal Msg As Long, _
ByVal wParam As Long, ByVal lParam As Long) As Long
If Msg = WM_QUERYENDSESSION Then
Debug.Print "QryEnd", wParam, lParam
Else
If Msg = WM_ENDSESSION Then
If wParam 0 Then '´ú±í½«Ë³Àû¹Ø»ú»òLogOff£¬Õâʱ±ãµÃ×öÕý³£½áÊø³ÌÐòµÄ²Ù×÷
Dim fno As Long
Open "c:\ttt" For Output As #1
Print #1, "hahcccc5"
Close #1
End If
End If
End If
'½«Ö®ËÍÍùÔÀ´µÄWindow Procedure
wndproc = CallWindowProc(preWinProc, hwnd, Msg, wParam, lParam)
End Function
|
|