晕倒,要发代码,提示我回复内容过长!
我发到博客了,你去看看我的实现:
http://www.cnblogs.com/ajiefj/archive/2010/05/11/1732384.html

解决方案 »

  1.   

    调用方法:Private Sub sBtn_Restart_Click(ByVal sender As Object, ByVal e As System.EventArgs)
        WindowsController.ExitWindows(SystemManager.RestartOptions.Reboot, False)
    End Sub
    Private Sub sBtn_HideBar_Click(ByVal sender As Object, ByVal e As System.EventArgs)
        'Hide the Task Pane
        ShowWindow(FindWindow("Shell_TrayWnd", Nothing), 0)
    End SubPrivate Sub sBtn_ShowBar_Click(ByVal sender As Object, ByVal e As System.EventArgs)
        'Show Task Pane
        ShowWindow(FindWindow("Shell_TrayWnd", Nothing), 5)
    End SubPrivate Sub sBtn_ClosePc_Click(ByVal sender As Object, ByVal e As System.EventArgs)
        WindowsController.ExitWindows(SystemManager.RestartOptions.ShutDown, False)
    End Sub
      

  2.   

    谢谢楼上回复,你那个Namespace程序在哪里加啊,请指教啊,谢了
      

  3.   

    http://topic.csdn.net/t/20060224/12/4574978.htmlOpenProcessToken等之类的函数调用后要判断返回值,确认调用是否成功?
    不判断不是好习惯Imports   System   
      Imports   System.Text   
      Imports   System.Diagnostics   
      Imports   System.Runtime.InteropServices   
      Public   Class   ExitWindwos   
              Public   Enum   RestartOptions   
                      LogOff   =   0   
                      PowerOff   =   8   
                      Reboot   =   2   
                      ShutDown   =   1   
                      Suspend   =   -1   
                      Hibernate   =   -2   
                      'EWX_FORCE   =   4   
              End   Enum   
        
              Public   Structure   LUID   
                      Dim   LowPart   As   Integer   
                      Dim   HighPart   As   Integer   
              End   Structure   
        
              Public   Structure   LUID_AND_ATTRIBUTES   
        
                      Dim   pLuid   As   LUID   
        
                      Dim   Attributes   As   Integer   
              End   Structure   
        
              Public   Structure   TOKEN_PRIVILEGES   
        
                      Dim   PrivilegeCount   As   Integer   
        
                      Dim   Privileges   As   LUID_AND_ATTRIBUTES   
              End   Structure   
        
              Private   Const   TOKEN_ADJUST_PRIVILEGES   =   &H20   
              Private   Const   TOKEN_QUERY   =   &H8   
              Private   Const   SE_PRIVILEGE_ENABLED   =   &H2   
              Private   Const   FORMAT_MESSAGE_FROM_SYSTEM   =   &H1000   
              Private   Const   EWX_FORCE   =   4   
              Private   Declare   Function   LoadLibrary   Lib   "kernel32"   Alias   "LoadLibraryA"   (ByVal   lpLibFileName   As   String)   As   IntPtr   
              Private   Declare   Function   FreeLibrary   Lib   "kernel32"   (ByVal   hLibModule   As   IntPtr)   As   Integer   
              Private   Declare   Function   GetProcAddress   Lib   "kernel32"   (ByVal   hModule   As   IntPtr,   ByVal   lpProcName   As   String)   As   IntPtr   
              Private   Declare   Function   SetSuspendState   Lib   "Powrprof"   (ByVal   Hibernate   As   Integer,   ByVal   ForceCritical   As   Integer,   ByVal   DisableWakeEvent   As   Integer)   As   Integer   
              Private   Declare   Function   OpenProcessToken   Lib   "advapi32.dll"   (ByVal   ProcessHandle   As   IntPtr,   ByVal   DesiredAccess   As   Integer,   ByRef   TokenHandle   As   IntPtr)   As   Integer   
              Private   Declare   Function   LookupPrivilegeValue   Lib   "advapi32.dll"   Alias   "LookupPrivilegeValueA"   (ByVal   lpSystemName   As   String,   ByVal   lpName   As   String,   ByRef   lpLuid   As   LUID)   As   Integer   
              Private   Declare   Function   AdjustTokenPrivileges   Lib   "advapi32.dll"   (ByVal   TokenHandle   As   IntPtr,   ByVal   DisableAllPrivileges   As   Integer,   ByRef   NewState   As   TOKEN_PRIVILEGES,   ByVal   BufferLength   As   Integer,   ByRef   PreviousState   As   TOKEN_PRIVILEGES,   ByRef   ReturnLength   As   Integer)   As   Integer   
              Private   Declare   Function   ExitWindowsEx   Lib   "user32"   (ByVal   uFlags   As   Integer,   ByVal   dwReserved   As   Integer)   As   Integer   
              Private   Declare   Function   FormatMessage   Lib   "kernel32"   Alias   "FormatMessageA"   (ByVal   dwFlags   As   Integer,   ByVal   lpSource   As   IntPtr,   ByVal   dwMessageId   As   Integer,   ByVal   dwLanguageId   As   Integer,   ByVal   lpBuffer   As   StringBuilder,   ByVal   nSize   As   Integer,   ByVal   Arguments   As   Integer)   As   Integer   
        
              Private   Sub   ExitWindows(ByVal   how   As   RestartOptions,   ByVal   force   As   Boolean)   
                      Select   Case   how   
                              Case   RestartOptions.Suspend   
                                      SuspendSystem(False,   force)   
                              Case   RestartOptions.Hibernate   
                                      SuspendSystem(True,   force)   
                              Case   Else   
                                      ExitWindows(Convert.ToInt32(how),   force)   
                      End   Select   
              End   Sub   
        
              Private   Sub   ExitWindows(ByVal   how   As   Integer,   ByVal   force   As   Boolean)   
                      EnableToken("SeShutdownPrivilege")   
                      If   force   Then   how   =   how   Or   EWX_FORCE   
                      If   (ExitWindowsEx(how,   0)   =   0)   Then   Throw   New   PrivilegeException(FormatError(Marshal.GetLastWin32Error()))   
              End   Sub   
        
              Private   Sub   EnableToken(ByVal   privilege   As   String)   
                      If   Not   CheckEntryPoint("advapi32.dll",   "AdjustTokenPrivileges")   Then   Return   
                      Dim   tokenHandle   As   IntPtr   =   IntPtr.Zero   
                      Dim   privilegeLUID   =   New   LUID   
                      Dim   newPrivileges   =   New   TOKEN_PRIVILEGES   
                      Dim   tokenPrivileges   As   TOKEN_PRIVILEGES   
                      If   (OpenProcessToken(Process.GetCurrentProcess().Handle,   TOKEN_ADJUST_PRIVILEGES   Or   TOKEN_QUERY,   tokenHandle))   =   0   Then   Throw   New   PrivilegeException(FormatError(Marshal.GetLastWin32Error()))   
                      If   (LookupPrivilegeValue("",   privilege,   privilegeLUID))   =   0   Then   Throw   New   PrivilegeException(FormatError(Marshal.GetLastWin32Error()))   
                      tokenPrivileges.PrivilegeCount   =   1   
                      tokenPrivileges.Privileges.Attributes   =   SE_PRIVILEGE_ENABLED   
                      tokenPrivileges.Privileges.pLuid   =   privilegeLUID   
                      Dim   Size   As   Integer   =   4   
                      If   (AdjustTokenPrivileges(tokenHandle,   0,   tokenPrivileges,   4   +   (12   *   tokenPrivileges.PrivilegeCount),   newPrivileges,   Size))   =   0   Then   Throw   New   PrivilegeException(FormatError(Marshal.GetLastWin32Error()))   
              End   Sub   
        
              Private   Sub   SuspendSystem(ByVal   hibernate   As   Boolean,   ByVal   force   As   Boolean)   
                      If   Not   CheckEntryPoint("powrprof.dll",   "SetSuspendState")   Then   Throw   New   PlatformNotSupportedException("The   SetSuspendState   method   is   not   supported   on   this   system!")   
                      SetSuspendState(Convert.ToInt32(IIf(hibernate,   1,   0)),   Convert.ToInt32(IIf(force,   1,   0)),   0)   
              End   Sub   
        
              Private   Function   CheckEntryPoint(ByVal   library   As   String,   ByVal   method   As   String)   As   Boolean   
                      Dim   libPtr   As   IntPtr   =   LoadLibrary(library)   
                      If   Not   libPtr.Equals(IntPtr.Zero)   Then   
                              If   Not   GetProcAddress(libPtr,   method).Equals(IntPtr.Zero)   Then   
                                      FreeLibrary(libPtr)   
                                      Return   True   
                              End   If   
                              FreeLibrary(libPtr)   
                      End   If   
                      Return   False   
              End   Function   
        
              Private   Function   FormatError(ByVal   number   As   Integer)   As   String   
                      Dim   Buffer   =   New   StringBuilder(255)   
                      FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM,   IntPtr.Zero,   number,   0,   Buffer,   Buffer.Capacity,   0)   
                      Return   Buffer.ToString()   
              End   Function   
        
              Public   Sub   LogOff()   '注销   
                      ExitWindows(RestartOptions.Reboot,   False)   
              End   Sub   
        
              Public   Sub   PowerOff()   '关闭电源   
                      ExitWindows(RestartOptions.PowerOff,   False)   
              End   Sub   
        
              Public   Sub   Reboot()   '重启计算机   
                      ExitWindows(RestartOptions.Reboot,   False)   
              End   Sub   
        
              Public   Sub   ShutDown()   '关闭系统   
                      ExitWindows(RestartOptions.ShutDown,   False)   
              End   Sub   
        
              Public   Sub   Suspend()   '待机   
                      ExitWindows(RestartOptions.Suspend,   False)   
              End   Sub   
        
              Public   Sub   Hibernate()   '休眠   
                      ExitWindows(RestartOptions.Hibernate,   False)   
              End   Sub   
        
      End   Class   
      Public   Class   PrivilegeException   
              Inherits   Exception   
        
              Public   Sub   New()   
                      MyBase.New()   
              End   Sub   
        
              Public   Sub   New(ByVal   message   As   String)   
                      MyBase.New(message)   
              End   Sub   
      End   Class