本帖最后由 duaozhuan0 于 2011-07-18 16:42:22 编辑

解决方案 »

  1.   

    正常关机或者注销重启的话会有个消息的,在你程序中hook系统消息,发现这些消息后就做你要做的事。
      

  2.   

    或许这个可以,这是VB的,在关机之前开启一个窗口,在窗口的QueryUnload事件里加入如下代码:If UnloadMode = 2 Then
      '如果UnloadMode=vbAppWindows(vbAppWindows = 2 ), _
       MSDN对vbAppWindows常数的解释:当前 Microsoft Windows 操作环境会话结束。
      '你要的代码
    End If
      

  3.   

    用的是xp ,xp win7 不一样吗?
    高手快来吧我看有人在05年就问这个问题
    http://topic.csdn.net/t/20050203/19/3774110.html
    谁能来个实例
      

  4.   

    安装全局Hook,当Hook到关机消息后先暂停关机,执行代码,执行完毕后再执行关机。
      

  5.   

    标准模块代码
    Option ExplicitPublic Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
    Public Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long) As LongPublic 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 Declare Function SetWindowsHookEx Lib "user32" Alias "SetWindowsHookExA" (ByVal idHook As Long, ByVal lpfn As Long, ByVal hmod As Long, ByVal dwThreadId As Long) As Long
    Public Declare Function UnhookWindowsHookEx Lib "user32" (ByVal hHook As Long) As Long
        
    Public Const GWL_WNDPROC = (-4)
    Public Const WM_ENDSESSION = &H16
    Public Const WM_QUERYENDSESSION = &H11
           
    Public preWinProc     As Long
    Public lngHook As Long
           
    Public Function funShutDownHook(ByVal hwnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
        funShutDownHook = 0
        If Msg = WM_QUERYENDSESSION Then
            Debug.Print "QryEnd", wParam, lParam
        Else
            If Msg = WM_ENDSESSION Then
                If wParam = 0 Then       '代表将顺利关机或LogOff,这时便得做正常结束程序的操作
                    '此处添加你要执行的代码
                    
                    
                    
                End If
            End If
        End If
        funShutDownHook = 1
    End Function
    Form1代码:Option ExplicitPrivate Sub Form_Load()
    '    lngHook = SetWindowsHookEx(WM_QUERYENDSESSION, AddressOf funShutDownHook, App.hInstance, 0)
        lngHook = SetWindowsHookEx(WM_ENDSESSION, AddressOf funShutDownHook, App.hInstance, 0)
    End SubPrivate Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)
        UnhookWindowsHookEx lngHook
    End Sub