C#实现关机功能

 更新时间:2022年06月16日 09:39:49   作者:天方  
这篇文章介绍了C#实现关机功能的方法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

在网上找的一个在C#中实现关机的类,非常简单,就是一个winapi的封装。在这里记录一下,以备不时之需。

public static class Shutdown
{
    [StructLayout(LayoutKind.Sequential, Pack = 1)]
    internal struct TokPriv1Luid
    {
        public int Count;
        public long Luid;
        public int Attr;
    }
    [DllImport("kernel32.dll", ExactSpelling = true)]
    internal static extern IntPtr GetCurrentProcess();
    [DllImport("advapi32.dll", ExactSpelling = true, SetLastError = true)]
    internal static extern bool OpenProcessToken(IntPtr h, int acc, ref IntPtr phtok);
    [DllImport("advapi32.dll", SetLastError = true)]
    internal static extern bool LookupPrivilegeValue(string host, string name, ref long pluid);
    [DllImport("advapi32.dll", ExactSpelling = true, SetLastError = true)]
    internal static extern bool AdjustTokenPrivileges(IntPtr htok, bool disall,
    ref TokPriv1Luid newst, int len, IntPtr prev, IntPtr relen);

    [DllImport("user32.dll", ExactSpelling = true, SetLastError = true)]

    internal static extern bool ExitWindowsEx(int DoFlag, int rea);
    internal const int SE_PRIVILEGE_ENABLED = 0x00000002;
    internal const int TOKEN_QUERY = 0x00000008;
    internal const int TOKEN_ADJUST_PRIVILEGES = 0x00000020;
    internal const string SE_SHUTDOWN_NAME = "SeShutdownPrivilege";
    internal const int EWX_LOGOFF = 0x00000000;
    internal const int EWX_SHUTDOWN = 0x00000001;
    internal const int EWX_REBOOT = 0x00000002;
    internal const int EWX_FORCE = 0x00000004;
    internal const int EWX_POWEROFF = 0x00000008;
    internal const int EWX_FORCEIFHUNG = 0x00000010;


    private static void DoExitWin(int DoFlag)
    {
        bool ok;
        TokPriv1Luid tp;
        IntPtr hproc = GetCurrentProcess();
        IntPtr htok = IntPtr.Zero;
        ok = OpenProcessToken(hproc, TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, ref htok);
        tp.Count = 1;
        tp.Luid = 0;
        tp.Attr = SE_PRIVILEGE_ENABLED;
        ok = LookupPrivilegeValue(null, SE_SHUTDOWN_NAME, ref tp.Luid);
        ok = AdjustTokenPrivileges(htok, false, ref tp, 0, IntPtr.Zero, IntPtr.Zero);
        ok = ExitWindowsEx(DoFlag, 0);
    }

    public static void Reboot()
    {
        DoExitWin(EWX_FORCE | EWX_REBOOT);
    }
    public static void PowerOff()
    {
        DoExitWin(EWX_FORCE | EWX_POWEROFF);
    }
    public static void LogOff()
    {
        DoExitWin(EWX_FORCE | EWX_LOGOFF);
    }
}

到此这篇关于C#实现关机功能的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • C#基础知识 全面解析可空类型

    C#基础知识 全面解析可空类型

    C# 2.0 中还引入了可空类型,可空类型也是值类型,只是可空类型是包括null的值类型的,下面就介绍下C#2.0中对可空类型的支持具体有哪些内容
    2012-11-11
  • C#保存图片到数据库并读取显示图片的方法

    C#保存图片到数据库并读取显示图片的方法

    将图像保存到SQL server2000的Image字段中
    2013-04-04
  • C# 创建EXCEL图表并保存为图片的实例

    C# 创建EXCEL图表并保存为图片的实例

    下面小编就为大家分享一篇C# 创建EXCEL图表并保存为图片的实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2017-12-12
  • Unity实现透视滑动列表

    Unity实现透视滑动列表

    这篇文章主要为大家详细介绍了Unity实现透视滑动列表,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-07-07
  • c#实现md5加密示例

    c#实现md5加密示例

    这篇文章主要介绍了md5加密,加密结果可以为32位、48位、64位,只要修改一下参数就可以实现
    2014-01-01
  • c#中LINQ的基本用法(二)

    c#中LINQ的基本用法(二)

    这篇文章介绍了c#中LINQ的基本用法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下的相关资料
    2022-04-04
  • C#中的委托Delegate

    C#中的委托Delegate

    这篇文章介绍了C#中的委托Delegate,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-05-05
  • C#设计模式之工厂模式

    C#设计模式之工厂模式

    本文详细讲解了C#设计模式之工厂模式,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-03-03
  • 通过容器扩展属性IExtenderProvider实现WinForm通用数据验证组件

    通过容器扩展属性IExtenderProvider实现WinForm通用数据验证组件

    这篇文章介绍了通过容器扩展属性IExtenderProvider实现WinForm通用数据验证组件的方法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-12-12
  • c#在sql中存取图片image示例

    c#在sql中存取图片image示例

    这篇文章主要介绍了c#在sql中存取图片image示例,需要的朋友可以参考下
    2014-03-03

最新评论