.版本 2
.程序集 窗口程序集_启动窗口
.程序集变量 程_配置文件, 文本型
.程序集变量 程_剩余时间, 整数型, , , 单位:秒
.程序集变量 程_运行状态, 整数型, , , 0=运行,1=停止。
.程序集变量 程_线程句柄, 整数型
.子程序 __启动窗口_创建完毕
程_配置文件 = 取运行目录 () + “\CloseComputer.ini”
读取设置函数 ()
.子程序 __启动窗口_可否被关闭, 逻辑型
保存设置函数 ()
.子程序 保存设置函数
.局部变量 Int, 整数型
.判断开始 (单选框_关机.选中)
Int = #EWX_SHUTDOWN
.判断 (单选框_重启.选中)
Int = #EWX_REBOOT
.默认
Int = #EWX_LOGOFF
.判断结束
.如果真 (选择框_强制终止.选中)
Int = 位或 (Int, #EWX_FORCE)
.如果真结束
写配置项 (程_配置文件, “设置”, “类型”, 到文本 (Int))
Int = 到整数 (编辑框_时.内容)
.如果真 (Int < 1)
Int = 0
.如果真结束
写配置项 (程_配置文件, “设置”, “小时”, 到文本 (Int))
Int = 到整数 (编辑框_分.内容)
.如果真 (Int < 1)
Int = 0
.如果真结束
写配置项 (程_配置文件, “设置”, “分钟”, 到文本 (Int))
Int = 到整数 (编辑框_秒.内容)
.如果真 (Int < 1)
Int = 0
.如果真结束
写配置项 (程_配置文件, “设置”, “秒钟”, 到文本 (Int))
.子程序 读取设置函数
.局部变量 Int, 整数型
Int = 到整数 (读配置项 (程_配置文件, “设置”, “类型”, ))
.如果真 (位与 (Int, #EWX_LOGOFF) = #EWX_LOGOFF)
单选框_注销.选中 = 真
单选框_关机.选中 = 假
单选框_重启.选中 = 假
.如果真结束
.如果真 (位与 (Int, #EWX_SHUTDOWN) = #EWX_SHUTDOWN)
单选框_注销.选中 = 假
单选框_关机.选中 = 真
单选框_重启.选中 = 假
.如果真结束
.如果真 (位与 (Int, #EWX_REBOOT) = #EWX_REBOOT)
单选框_注销.选中 = 假
单选框_关机.选中 = 假
单选框_重启.选中 = 真
.如果真结束
.判断开始 (位与 (Int, #EWX_FORCE) = #EWX_FORCE)
选择框_强制终止.选中 = 真
.默认
选择框_强制终止.选中 = 假
.判断结束
Int = 到整数 (读配置项 (程_配置文件, “设置”, “小时”, ))
.如果真 (Int < 1)
Int = 0
.如果真结束
编辑框_时.内容 = 到文本 (Int)
Int = 到整数 (读配置项 (程_配置文件, “设置”, “分钟”, ))
.如果真 (Int < 1)
Int = 0
.如果真结束
编辑框_分.内容 = 到文本 (Int)
Int = 到整数 (读配置项 (程_配置文件, “设置”, “秒钟”, ))
.如果真 (Int < 1)
Int = 0
.如果真结束
编辑框_秒.内容 = 到文本 (Int)
.子程序 _按钮_开始_被单击
.局部变量 mProcess, 整数型
.局部变量 mType, 整数型
.如果真 (程_线程句柄 ≠ 0)
返回 ()
.如果真结束
连续赋值 (真, 按钮_开始.禁止, 按钮_取消.禁止)
mProcess = GetCurrentProcess ()
.如果真 (获取进程关机权限 (mProcess) = 假)
信息框 (“获取关机权限失败!”, #信息图标, “提示”, _启动窗口)
连续赋值 (假, 按钮_开始.禁止, 按钮_取消.禁止)
返回 ()
.如果真结束
程_剩余时间 = 到整数 (编辑框_时.内容) × 60 × 60
.如果真 (程_剩余时间 < 1)
程_剩余时间 = 0
.如果真结束
程_剩余时间 = 程_剩余时间 + 到整数 (编辑框_分.内容) × 60
.如果真 (程_剩余时间 < 1)
程_剩余时间 = 0
.如果真结束
程_剩余时间 = 程_剩余时间 + 到整数 (编辑框_秒.内容)
.如果真 (程_剩余时间 < 1)
程_剩余时间 = 0
信息框 (“关机时间不能留空或者为小于 1 秒!”, #信息图标, “提示”, _启动窗口)
连续赋值 (假, 按钮_开始.禁止, 按钮_取消.禁止)
返回 ()
.如果真结束
.判断开始 (单选框_关机.选中)
mType = #EWX_SHUTDOWN
.判断 (单选框_重启.选中)
mType = #EWX_REBOOT
.默认
mType = #EWX_LOGOFF
.判断结束
.如果真 (选择框_强制终止.选中)
mType = 位或 (mType, #EWX_FORCE)
.如果真结束
程_运行状态 = 0
保存设置函数 () ' 关机前先保存配置
程_线程句柄 = CreateThread (0, 0, &关机计时函数, mType, 0, 0)
.如果真 (程_线程句柄 = 0)
信息框 (“启动计时线程失败!”, #信息图标, “提示”, _启动窗口)
连续赋值 (假, 按钮_开始.禁止, 按钮_取消.禁止)
返回 ()
.如果真结束
按钮_取消.禁止 = 假
.子程序 _按钮_取消_被单击
.局部变量 mRet, 整数型
.局部变量 Code, 整数型
.如果真 (程_线程句柄 = 0)
返回 ()
.如果真结束
连续赋值 (真, 按钮_开始.禁止, 按钮_取消.禁止)
程_运行状态 = 1 ' 需要取消关机
.计次循环首 (15, )
mRet = GetExitCodeThread (程_线程句柄, Code)
.如果真 (mRet = 0) ' 线程句柄已无效
程_线程句柄 = 0
跳出循环 ()
.如果真结束
.如果真 (Code = 1) ' 线程已安全退出
CloseHandle (程_线程句柄)
程_线程句柄 = 0
跳出循环 ()
.如果真结束
高级延时 (1000)
.计次循环尾 ()
.如果真 (程_线程句柄 ≠ 0)
mRet = TerminateThread (程_线程句柄, 0)
.如果真 (mRet ≠ 0)
程_线程句柄 = 0
.如果真结束
.如果真结束
.判断开始 (程_线程句柄 = 0)
连续赋值 (假, 按钮_开始.禁止, 按钮_取消.禁止)
.默认
按钮_取消.禁止 = 假
信息框 (“关闭计时线程失败!”, #信息图标, “提示”, _启动窗口)
.判断结束
.子程序 关机计时函数, 整数型, , 返回1表示已正常退出
.参数 关机类型, 整数型
.局部变量 倒计时, 整数型
.局部变量 显示, 文本型
.如果真 (位与 (关机类型, #EWX_LOGOFF) = #EWX_LOGOFF)
显示 = “注销用户”
.如果真结束
.如果真 (位与 (关机类型, #EWX_SHUTDOWN) = #EWX_SHUTDOWN)
显示 = “关闭系统”
.如果真结束
.如果真 (位与 (关机类型, #EWX_REBOOT) = #EWX_REBOOT)
显示 = “重启系统”
.如果真结束
倒计时 = 程_剩余时间
标签4.标题 = “倒计时:” + 到文本 (倒计时) + “ 秒后” + 显示
.计次循环首 (程_剩余时间, )
.如果真 (程_运行状态 = 1)
跳出循环 ()
.如果真结束
高级延时 (1000)
倒计时 = 倒计时 - 1
标签4.标题 = “倒计时:” + 到文本 (倒计时) + “ 秒后” + 显示
.计次循环尾 ()
.如果真 (程_运行状态 = 0)
保存设置函数 () ' 关机前先保存配置
ExitWindowsEx (关机类型, 0)
.如果真结束
返回 (1)
.子程序 获取进程关机权限, 逻辑型, , 为指定进程获取关机权限,成功返回真,失败返回假。
.参数 hProcess, 整数型, , 需要获取关机权限进程的句柄。
.局部变量 mToken, 整数型, , , 进程令牌
.局部变量 Tkp, TOKEN_PRIVILEGES, , , 令牌状态
.如果真 (OpenProcessToken (hProcess, 位或 (#TOKEN_QUERY, #TOKEN_ADJUST_PRIVILEGES), mToken) = 0)
输出调试文本 (“获取进程令牌失败!”)
返回 (假)
.如果真结束
.如果真 (LookupPrivilegeValue (0, #SE_SHUTDOWN_NAME, Tkp.Privileges [1].Luid) = 0)
CloseHandle (mToken)
输出调试文本 (“查询进程权限失败!”)
返回 (假)
.如果真结束
Tkp.PrivilegeCount = 1
Tkp.Privileges [1].Attributes = #SE_PRIVILEGE_ENABLED
.如果真 (AdjustTokenPrivileges (mToken, 假, Tkp, 0, 0, 0) = 0)
输出调试文本 (“调整进程权限失败!”)
返回 (假)
.如果真结束
CloseHandle (mToken)
返回 (真)
.子程序 高级延时, 逻辑型, , 暂停当前线程的运行并等待指定的时间,成功返回真,失败返回假(失败时可能已经等待了部分时间)。
.参数 欲等待的时间, 整数型, , 欲暂停线程执行的时间,单位为毫秒。
.局部变量 等待时间, 长整数型
.局部变量 定时器对象, 整数型
等待时间 = -10 × 欲等待的时间 × 1000 ' 换算成微秒
定时器对象 = CreateWaitableTimerA (0, 0, 0)
.如果真 (定时器对象 = 0)
返回 (假)
.如果真结束
.如果真 (SetWaitableTimer (定时器对象, 等待时间, 0, 0, 0, 0) = 0) ' 启动一个可等待的定时器
返回 (假)
.如果真结束
.循环判断首 ()
等待时间 = MsgWaitForMultipleObjects (1, 定时器对象, 0, -1, 255)
.如果真 (等待时间 = -1)
跳出循环 ()
.如果真结束
处理事件 ()
.循环判断尾 (等待时间 ≠ 0)
CloseHandle (定时器对象) ' 关闭计时器对象,释放资源
.判断开始 (等待时间 = 0)
返回 (真)
.默认
返回 (假)
.判断结束