VB实现关机程序

VB实现关机程序下面是本人愿来写的关机程序可以适用于98/xp/2000,在程序中调用即可。现在操作系统多为2000或xp,所以需要特别注意的是应该先得到关机的特权:(要想弄懂下面的程序,先要具备vb调用api函数的知识……)其中:前面一些Public Declare都是api函数的声明.     Public Sub AdjustToken()子程序用来取得关机特权.     Public Sub Sh

大家好,又见面了,我是你们的朋友全栈君。下面是本人愿来写的关机程序可以适用于98/xp/2000,在程序中调用即可。现在操作系统多为2000或xp,所以需要特别注意的是应该先得到关机的特权:(要想弄懂下面的程序,先要具备vb调用api函数的知识……)

其中:前面一些Public Declare都是api函数的声明.

     Public Sub AdjustToken()子程序用来取得关机特权.

     Public Sub Shutdown() ‘是关机子程序

     Public Sub Reboot() ‘是重启子程序

 

*********************代码开始了:*****************

Public Structure LUID

  Dim UsedPart As Integer

  Dim IgnoredForNowHigh32BitPart As Integer

 End Structure

 

 Public Structure LUID_AND_ATTRIBUTES

  Dim TheLuid As LUID

  Dim Attributes As Integer

 End Structure

 

 Public Structure TOKEN_PRIVILEGES

  Dim PrivilegeCount As Integer

  Dim TheLuid As LUID

  Dim Attributes As Integer

 End Structure

 

 ‘强制关机函数

 Public Declare Function ExitWindowsEx Lib “user32” (ByVal uFlags As Integer, ByVal dwReserved As Integer) As Integer

 

 ‘GetLastError函数返回本线程的最后一次错误代码。错误代码是按照线程

 ‘储存的,多线程也不会覆盖其他线程的错误代码。

 Public Declare Function GetLastError Lib “kernel32” () As Integer

 

 ‘GetCurrentProcess函数返回当前进程的一个句柄。

 Public Declare Function GetCurrentProcess Lib “kernel32” () As Integer

 

 ‘OpenProcessToken函数打开一个进程的访问代号。

 Public Declare Function OpenProcessToken Lib “advapi32” (ByVal ProcessHandle As Integer, ByVal DesiredAccess As Integer, ByRef TokenHandle As Integer) As Integer

 

 ‘LookupPrivilegeValue函数获得本地唯一的标示符(LUID),用于在特定的系统中

 ‘表示特定的优先权。

 ‘UPGRADE_WARNING: 结构 LUID 可能要求封送处理属性作为此声明语句中的参数传递。 单击以获得更多信息:“ms-help://MS.VSCC.2003/commoner/redir/redirect.htm?keyword=”vbup1050″”

 Public Declare Function LookupPrivilegeValue Lib “advapi32”  Alias “LookupPrivilegeValueA”(ByVal lpSystemName As String, ByVal lpName As String, ByRef lpLuid As LUID) As Integer

 

 ‘AdjustTokenPrivileges函数使能或者禁用指定访问记号的优先权。

 ‘使能或者禁用优先权需要TOKEN_ADJUST_PRIVILEGES访问权限。

 ‘UPGRADE_WARNING: 结构 TOKEN_PRIVILEGES 可能要求封送处理属性作为此声明语句中的参数传递。 单击以获得更多信息:“ms-help://MS.VSCC.2003/commoner/redir/redirect.htm?keyword=”vbup1050″”

 ‘UPGRADE_WARNING: 结构 TOKEN_PRIVILEGES 可能要求封送处理属性作为此声明语句中的参数传递。 单击以获得更多信息:“ms-help://MS.VSCC.2003/commoner/redir/redirect.htm?keyword=”vbup1050″”

 Public Declare Function AdjustTokenPrivileges Lib “advapi32” (ByVal TokenHandle As Integer, ByVal DisableAllPrivileges As Integer, ByRef NewState As TOKEN_PRIVILEGES, ByVal BufferLength As Integer, ByRef PreviousState As TOKEN_PRIVILEGES, ByRef ReturnLength As Integer) As Integer

 

 Public Declare Sub SetLastError Lib “kernel32” (ByVal dwErrCode As Integer)

 ‘********************************************************************

 ‘* 这个过程设置正确的优先权,以允许在Windows NT下关机或者重新启动。

 ‘********************************************************************

 Public Sub AdjustToken()

  

  Const TOKEN_ADJUST_PRIVILEGES As Short = &H20s

  Const TOKEN_QUERY As Short = &H8s

  Const SE_PRIVILEGE_ENABLED As Short = &H2s

  

  Dim hdlProcessHandle As Integer

  Dim hdlTokenHandle As Integer

  Dim tmpLuid As LUID

  Dim tkp As TOKEN_PRIVILEGES

  Dim tkpNewButIgnored As TOKEN_PRIVILEGES

  Dim lBufferNeeded As Integer

  

  ‘使用SetLastError函数设置错误代码为0。

  ‘这样做,GetLastError函数如果没有错误会返回0

  ”””’SetLastError 0

  

  ‘GetCurrentProcess函数设置 hdlProcessHandle变量

  hdlProcessHandle = GetCurrentProcess()

  

  ””’ If GetLastError <> 0 Then

  ””’ MsgBox “GetCurrentProcess error==” & GetLastError

  ””’ End If

  

  OpenProcessToken(hdlProcessHandle, TOKEN_ADJUST_PRIVILEGES Or TOKEN_QUERY, hdlTokenHandle)

  

  ””’ If GetLastError <> 0 Then

  ””’ MsgBox “OpenProcessToken error==” & GetLastError

  ””’ End If

  

  ‘ 获得关机优先权的LUID

  LookupPrivilegeValue(“”, “SeShutdownPrivilege”, tmpLuid)

  

  ””’If GetLastError <> 0 Then

  ””’MsgBox “LookupPrivilegeValue error==” & GetLastError

  ””’End If

  

  tkp.PrivilegeCount = 1 ‘ 设置一个优先权

  ‘UPGRADE_WARNING: 未能解析对象 tkp.TheLuid 的默认属性。 单击以获得更多信息:“ms-help://MS.VSCC.2003/commoner/redir/redirect.htm?keyword=”vbup1037″”

  tkp.TheLuid = tmpLuid

  tkp.Attributes = SE_PRIVILEGE_ENABLED

  

  ‘ 对当前进程使能关机优先权

  AdjustTokenPrivileges(hdlTokenHandle, False, tkp, Len(tkpNewButIgnored), tkpNewButIgnored, lBufferNeeded)

  

  ””’If GetLastError <> 0 Then

  ””’MsgBox “AdjustTokenPrivileges error==” & GetLastError

  ””’End If

  

 End Sub

 Public Sub Shutdown() ‘关机子程序

  ‘******************根据windows版本来关机************************

  If glngWhichWindows32 = mlngWindowsNT Then

   AdjustToken() ‘调用取得优先权子程序

  End If

  

  ExitWindowsEx(EWX_SHUTDOWN Or EWX_FORCE, &HFFFFs)

  ‘*****************************************************************

 End Sub

 

 Public Sub Reboot() ‘重启子程序

  ‘******************根据windows版本来关机************************

  If glngWhichWindows32 = mlngWindowsNT Then

   AdjustToken() ‘调用取得优先权子程序

  End If

  

  ExitWindowsEx(EWX_REBOOT Or EWX_FORCE, &HFFFFs)

  ‘*****************************************************************

 End Sub 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/162980.html原文链接:https://javaforall.net

(0)
上一篇 2022年7月22日 下午7:16
下一篇 2022年7月22日 下午7:16


相关推荐

  • 【深度讲解】手把手教你python制作萝莉音智能对话语音机器人,附全部源码!速速学起来!!

    文章目录演示先看看前言一定要看第一步实现普通智能对话第二步文字转萝莉音第三步播放音频第四步综合上述代码完整代码下载地址演示先看看前言一定要看为了让大家真正学会,我用分模块步骤的方式讲解,这样也能让大家不仅在娱乐的同时,还能学到知识。东西有点多,你大可不必着急复制粘贴,你只需要看看我的讲解即可,最下面可以直接下载完整的源码文件。第一步实现普通智能对话代码如下:#coding=gbk”””作者:川川时间:2021/8/21″””importrequestsprint(‘请输入你想说的

    2022年4月17日
    71
  • GPT-4o:将照片ghibli风格化

    GPT-4o:将照片ghibli风格化

    2026年3月15日
    2
  • redisclient命令_redisconnection

    redisclient命令_redisconnectionRedisClientRedis服务器是典型的一对多服务器程序一个服务器可以与多个客户端建立网络连接,每个客户端可以向服务器发送命令请求,而服务器则接收并处理客户端发送的命令请求,并向客户端返回命令回复。通过使用由I/O多路复用技术实现的文件事件处理器,Redis服务器使用单线程单进程的方式来处理命令请求,并与多个客户端进行网络通信。核心实现概述对于每个与服务器进行连接的客户端,服务器都为这些客户端建立了相应的redis.h/redisClient结构(客户端状态),这个结构保存了

    2022年10月12日
    4
  • 科大讯飞发布星火X1.5深度推理大模型 率先攻克国产算力MoE训练效率难题

    科大讯飞发布星火X1.5深度推理大模型 率先攻克国产算力MoE训练效率难题

    2026年3月14日
    3
  • micro hdmi引脚定义义_MAX232引脚图 接线图 电路图 及RS232引脚定义

    micro hdmi引脚定义义_MAX232引脚图 接线图 电路图 及RS232引脚定义MAX232 是一种把电脑的串行口 RS232 信号电平 10 10v 转换为单片机所用到的 TTL 信号点平 0 5 的芯片 这个芯片的价格比较贵大约要 5 元 下图为 MAX232 引脚图和接线图 及 RS232 引脚定义 带有转串口的电路 TTL CMOSINPUTS 端 这个端口是的作用是输入 TLL 或 CMOS 信号的 一般为 0 5V 低电平为零 高电平为 VCC TTL CMOSO

    2026年3月17日
    2
  • mptcp的重传

    mptcp的重传开头啰嗦几句 关于 mptcp 的研究主要有两种 拥塞控制和数据包调度 关于多径的拥塞控制算法有 LIA OLIA BALIA wVegas 可以称作是耦合式的拥塞控制 为什么要采用耦合式的拥塞控制 而不是在各个子流上采用原有的 TCP 的拥塞控制算法 RENO CUBIC 呢 用学术点的话说 考虑到网络中大部分是 TCP 流 MPTCP 应该保有 TCP 友好的特性 用朴实的话说 做为一个研究项目 总要有些不同吧

    2026年1月30日
    3

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号