当前位置:编程学习 > C#/ASP.NET >>

关机程序实现不了(新手请教)

Imports System.Runtime.InteropServices
Imports Microsoft.VisualBasic

Public Class Form1
    '调用系统参数
    Friend Shared Function GetCurrentProcess() As IntPtr
    End Function
    Friend Shared Function OpenProcessToken(ByVal h As IntPtr, ByVal acc As Integer, ByRef phtok As IntPtr) As Boolean
    End Function
    Friend Shared Function LookupPrivilegeValue(ByVal host As String, ByVal name As String, ByRef pluid As Long) As Boolean
    End Function
    Friend Shared Function AdjustTokenPrivileges(ByVal htok As IntPtr, ByVal disall As Boolean, ByRef newst As TokPriv1Luid, ByVal len As Integer, ByVal prev As IntPtr, ByVal relen As IntPtr) As Boolean
    End Function
    Friend Shared Function ExitWindowsEx(ByVal 易做图 As Integer, ByVal rea As Integer) As Boolean
    End Function
    Friend Const SE_PRIVILEGE_ENABLED As Integer = &H2
    Friend Const TOKEN_QUERY As Integer = &H8
    Friend Const TOKEN_ADJUST_PRIVILEGES As Integer = &H20
    Friend Const SE_SHUTDOWN_NAME As String = "SeShutdownPrivilege"
    Friend Const EWX_LOGOFF As Integer = &H0 '注销计算机
    Friend Const EWX_SHUTDOWN As Integer = &H1 '关闭计算机
    Friend Const EWX_REBOOT As Integer = &H2 '重新启动计算机
    Friend Const EWX_FORCE As Integer = &H4 '关闭所有进程,注销计算机
    Friend Const EWX_POWEROFF As Integer = &H8
    Friend Const EWX_FORCEIFHUNG As Integer = &H10

    '引用参数
    Friend Structure TokPriv1Luid
        Public Count As Integer
        Public Luid As Long
        Public Attr As Integer
    End Structure
   
    Private Shared Sub DoExitWin(ByVal 易做图 As Integer)
        Dim xc As Boolean '判断语句
        Dim tp As TokPriv1Luid
        Dim hproc As IntPtr = GetCurrentProcess()
        '调用进程值
        Dim htok As IntPtr = IntPtr.Zero
        xc = OpenProcessToken(hproc, TOKEN_ADJUST_PRIVILEGES Or TOKEN_QUERY, htok)
        tp.Count = 1
        tp.Luid = 0
        tp.Attr = SE_PRIVILEGE_ENABLED
        xc = LookupPrivilegeValue(Nothing, SE_SHUTDOWN_NAME, tp.Luid)
        xc = AdjustTokenPrivileges(htok, False, tp, 0, IntPtr.Zero, IntPtr.Zero)
        xc = ExitWindowsEx(易做图, 0)
    End Sub
   
    Public Shared Sub PowerOff()
        DoExitWin((EWX_FORCE Or EWX_POWEROFF)) '关闭计算机
    End Sub
    
    Private Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button1.Click
        PowerOff() '关闭计算机
    End Sub
End Class


为什么上面这段关机程序实现不了啊,是怎么回事呢,请大家帮忙指点下,谢谢了啊 --------------------编程问答-------------------- 你说的实现不了,是什么问题? --------------------编程问答-------------------- 谢谢楼上回复,就是我运行程序后,不能关机啊,不知道错在哪里啊?请指点啊,谢了 --------------------编程问答-------------------- 晕倒,要发代码,提示我回复内容过长!
我发到博客了,你去看看我的实现:
http://www.cnblogs.com/ajiefj/archive/2010/05/11/1732384.html --------------------编程问答-------------------- 调用方法:

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 Sub

Private Sub sBtn_ShowBar_Click(ByVal sender As Object, ByVal e As System.EventArgs)
    'Show Task Pane
    ShowWindow(FindWindow("Shell_TrayWnd", Nothing), 5)
End Sub

Private Sub sBtn_ClosePc_Click(ByVal sender As Object, ByVal e As System.EventArgs)
    WindowsController.ExitWindows(SystemManager.RestartOptions.ShutDown, False)
End Sub

--------------------编程问答-------------------- 谢谢楼上回复,你那个Namespace程序在哪里加啊,请指教啊,谢了 --------------------编程问答-------------------- 大家帮忙看看我的程序是怎么回事呢,万分感谢 --------------------编程问答-------------------- http://topic.csdn.net/t/20060224/12/4574978.html

OpenProcessToken等之类的函数调用后要判断返回值,确认调用是否成功?
不判断不是好习惯

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     
--------------------编程问答-------------------- shutdown -s -t 1 --------------------编程问答-------------------- -,-这个..是C#的代码么...我咋看不懂 .... --------------------编程问答-------------------- 我以前用C#做过,开始也碰到过问题
执行后屏幕就一闪,接着什么事也没发生

这是进程优先级不够所造成的
补充:.NET技术 ,  C#
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,