DELPHI实现关机,兼容全部WINDOWS系统

转自:http://blog.sina.com.cn/s/blog_611ab6c50100mznx.html

{=======================================================================================================================
关闭Windows函数ExitWindowsEx(UINT uFlag,DWORD:dwReserved)说明:

控制WINDOWS的开关:如关闭WINDOWS,重新启动WINDOWS等, ExitWindowsEx(UINT uFlags,DWORD dwReserved);是实现这一功能的API函数。如果Complile时提示EWX_XXXX未定义,那么请手动定义这几个常数,默认情况下是无需我们手动定义的。
const
 EWX_FORCE=4; //关闭所有程序并以其他用户身份登录?(!!应为“强制执行否”吧!!)
 EWX_LOGOFF=0; //重新启动计算机并切换到MS-DOS方式
 EWX_REBOOT=2; //重新启动计算机
 EWX_SHUTDOWN=1;//关闭计算机
 EWX_POWEROFF=8;//切断电源
 EWX_FORCEIFHUNG=$10;//不记得了,有谁好心查下MSDN
调用方法:
 ExitWindowsEx(EWX_REBOOT,0); //重启计算机
 ExitWindowsEx(EWX_FORCE+EWX_SHUTDOWN,0); //强行关机

不过博主经常听到有人说这一API只在Windows 95/98/98SE/Me下有效,而在Windows NT/2000/XP下无效。
 其实这是不正确的,这一API在上述平台下均是有效的,只是我们在Windows NT/2000/XP平台下执行此函数之前,必须要获取得关机特权罢了,其实就算是Windows NT/2000/XP系统自身关机也必须要走这一流程的。

view plainprint?

  1. 获取关机特权函数如下:
  2. procedure Get_Shutdown_Privilege; //获得用户关机特权,仅对Windows NT/2000/XP
  3. var
  4. rl: Cardinal;
  5. hToken: Cardinal;
  6. tkp: TOKEN_PRIVILEGES;
  7. begin
  8. OpenProcessToken(GetCurrentProcess, TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, hToken);
  9. if LookupPrivilegeValue(nil, ‘SeShutdownPrivilege‘, tkp.Privileges[0].Luid) then
  10. begin
  11. tkp.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
  12. tkp.PrivilegeCount := 1;
  13. AdjustTokenPrivileges(hToken, False, tkp, 0, nil, rl);
  14. end;
  15. end;

另一个关机API,InitiateSystemShutdown(PChar(Computer_Name),PChar(Hint_Msg),Time,Force,Reboot);在Windows NT/2000/XP平台下还会自动调用系统本身的关机提示窗口。
 InitiateSystemShutdown(PChar(Computer_Name), PChar(Hint_Msg),Time,Force,Reboot);
                      //关机计算机名,关机提示信息,停留时长,是否强行关机,是否要重启
 当我们把Computer_Name设为nil时,默认为本机,如 InitiateSystemshutdown(nil,nil,0,True,False);//强行关机

由于我们需要制作一个通用的关机程序,故要对当前的操作系统进行判断,这个比较简单,函数如下:

    1. function GetOperatingSystem: string;//获取操作系统信息
    2. var  osVerInfo: TOSVersionInfo;
    3. begin
    4. Result :=‘‘;
    5. osVerInfo.dwOSVersionInfoSize := SizeOf(TOSVersionInfo);
    6. if GetVersionEx(osVerInfo) then
    7. case osVerInfo.dwPlatformId of
    8. VER_PLATFORM_WIN32_NT:
    9. begin
    10. Result := ‘Windows NT/2000/XP‘
    11. end;
    12. VER_PLATFORM_WIN32_WINDOWS:
    13. begin
    14. Result := ‘Windows 95/98/98SE/Me‘;
    15. end;
    16. end;
    17. end;
    18. 执行关机的主函数:
    19. procedure ShutDownComputer;
    20. begin
    21. if GetOperatingSystem=‘Windows NT/2000/XP‘ then
    22. begin
    23. Get_Shutdown_Privilege;
    24. //调用此函数会出现系统关机提示窗口,并允许用户取消关机动作
    25. //InitiateSystemShutDown(nil,‘关机提示:讨厌你所以关了你!‘,0,True,False);
    26. ExitWindowsEx(EWX_SHUTDOWN+EWX_FORCE+EWX_POWEROFF+EWX_FORCEIFHUNG,0);
    27. end else
    28. begin
    29. ExitWindowsEx(EWX_SHUTDOWN+EWX_FORCE+EWX_POWEROFF+EWX_FORCEIFHUNG,0);
    30. end;
    31. end;
    32. =========================================================================================================================}
    33. 使用:
    34. procedure TShutDownForm.btn_PowerOffClick(Sender:Object);
    35. begin
    36. ShutDownComputer;
    37. end;
时间: 2024-10-18 16:00:42

DELPHI实现关机,兼容全部WINDOWS系统的相关文章

DELPHI实现关机,兼容全部WINDOWS系统 转

{=======================================================================================================================关闭Windows函数ExitWindowsEx(UINT uFlag,DWORD:dwReserved)说明: 控制WINDOWS的开关:如关闭WINDOWS,重新启动WINDOWS等, ExitWindowsEx(UINT uFlags,DWORD dwR

一块移动硬盘怎样兼容Mac和Windows系统,并且可以在time machine上使用

Mac的内存通常不是很大,加上使用Mac的time machine备份的话,是需要外置U盘或硬盘的.U盘存储空间较小,大家也不会去分区,直接拿来用在Mac上或者Windows上就可以了.所以这里只说硬盘.现在的USB接口的移动硬盘白菜价,四五百块钱1T的硬盘是现在最常用的,也是我买的类型.我希望这块硬盘可以用在time machine备份上,也可以在Mac和Windows上读写文件. 上网查了很多,也试了几个方法,网上关于Mac和Windows可共同读写硬盘的讨论很多,大致方法有两种: 1.移动

C#实现控制Windows系统关机、重启和注销的方法:

shutdown命令的参数: shutdown.exe -s:关机shutdown.exe -r:关机并重启shutdown.exe -l:注销当前用户 shutdown.exe -s -t 时间:设置关机倒计时shutdown.exe -h:休眠shutdown.exe -t 时间:设置关机倒计时.默认值是 30 秒.shutdown.exe -a:取消关机shutdown.exe -f:强行关闭应用程序而没有警告shutdown.exe -m \计算机名:控制远程计算机shutdown.ex

C#捕获windows关机事件,在系统关机前做一些自己想做的事

C#捕获windows关机事件,在系统关机前做一些自己想做的事: 有些时候我们可能想在Windows关机时记录或处理一些事情,这里提供几种方法. 方法一: /// <summary> /// 窗口过程的回调函数 /// </summary> /// <param name="m"></param> protected override void WndProc(ref Message m) { switch (m.Msg) { //此消息

Windows系统下制作Android开关机动画

在Windows系统下,做Android开关机动画时,需要注意几个问题: 1.选择压缩时 2.压缩的格式:

C#实现控制Windows系统关机、重启和注销的方法

shutdown.exe -s:关机shutdown.exe -r:关机并重启shutdown.exe -l:注销当前用户 shutdown.exe -s -t 时间:设置关机倒计时shutdown.exe -h:休眠shutdown.exe -t 时间:设置关机倒计时.默认值是 30 秒.shutdown.exe -a:取消关机shutdown.exe -f:强行关闭应用程序而没有警告shutdown.exe -m \计算机名:控制远程计算机shutdown.exe -i:显示"远程关机&qu

C#控制Windows系统关机、重启和注销的代码

如下资料是关于C#控制Windows系统关机.重启和注销的代码. protected void btnShutDown_Click(object sender, EventArgs e) { } protected void btnRestart_Click(object sender, EventArgs e) { } protected void btnLogOff_Click(object sender, EventArgs e) { } 原文地址:https://www.cnblogs.

Delphi - Windows系统下,Delphi调用API函数和7z.dll动态库,自动把文件压缩成.tar.gz格式的文件

项目背景 应欧美客户需求,需要将文件压缩成.tar.gz格式的文件,并上传给客户端SFTP服务器. 你懂的,7-Zip软件的显著特点是文件越大压缩比越高,在Linux系统上相当于我们Windows系统上WinRAR或者好压软件一样的存在. 7-Zip软件下载与安装 网上下载相关安装包并完成安装,找到安装目录,复制7z.dll文件到D盘. .bat文件的制作 通过7-Zip软件使用手册了解到,通过动态命令行调用7z.dll可以把文件压缩成.tar.gz格式的,实际上是先将文件压缩成.tar格式的文

Windows 系统错误代码

0-操作成功完成. 1-函数不正确. 2-系统找不到指定的文件. 3-系统找不到指定的路径. 4-系统无法打开文件. 5-拒绝访问. 6-句柄无效. 7-存储控制块被损坏. 8-存储空间不足,无法处理此命令. 9-存储控制块地址无效. 10-环境不正确. 11-试图加载格式不正确的程序. 12-访问码无效. 13-数据无效. 14-存储空间不足,无法完成此操作. 15-系统找不到指定的驱动器. 16-无法删除目录. 17-系统无法将文件移到不同的磁盘驱动器. 18-没有更多文件. 19-介质受写