¡¡XiaoHui.Net Ц»ã³ÌÐòÔ±ÂÛ̳ ¡ú Visual Basic ÌÖÂÛÇø

   Ôڹػú»òLogffǰÐÅÏ¢µÄÀ¹½Ø


Ò³: [1]

wzf_sky2007-11-5 08:50
Ôڹػú»ò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



²é¿´ÍêÕû°æ±¾: Ôڹػú»òLogffǰÐÅÏ¢µÄÀ¹½Ø