zoukankan      html  css  js  c++  java
  • DELPHI实现关机,兼容全部WINDOWS系统

    关闭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系统自身关机也必须要走这一流程的。

    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;  

    获取关机特权函数如下: 

    procedure Get_Shutdown_Privilege; //获得用户关机特权,仅对Windows NT/2000/XP 

    var 

    rl: Cardinal; 

    hToken: Cardinal;

    tkp: TOKEN_PRIVILEGES; 

    begin 

    OpenProcessToken(GetCurrentProcess, TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, hToken);  

    if LookupPrivilegeValue(nil, 'SeShutdownPrivilege', tkp.Privileges[0].Luid) then  

    begin

     tkp.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;

     tkp.PrivilegeCount := 1; 

     AdjustTokenPrivileges(hToken, False, tkp, 0, nil, rl);  

    end;  

    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.   执行关机的主函数:  
    20.   procedure ShutDownComputer;  
    21.   begin  
    22.     if GetOperatingSystem='Windows NT/2000/XP' then   
    23.     begin   
    24.       Get_Shutdown_Privilege;  
    25.       //调用此函数会出现系统关机提示窗口,并允许用户取消关机动作  
    26.       //InitiateSystemShutDown(nil,'关机提示:讨厌你所以关了你!',0,True,False);  
    27.       ExitWindowsEx(EWX_SHUTDOWN+EWX_FORCE+EWX_POWEROFF+EWX_FORCEIFHUNG,0);  
    28.     end else  
    29.     begin  
    30.       ExitWindowsEx(EWX_SHUTDOWN+EWX_FORCE+EWX_POWEROFF+EWX_FORCEIFHUNG,0);  
    31.     end;  
    32.   end;   
    33. =========================================================================================================================}  
    34.   
    35. 使用:  
    36.   
    37. procedure TShutDownForm.btn_PowerOffClick(Sender:Object);  
    38. begin  
    39.   ShutDownComputer;  
    40. end
  • 相关阅读:
    Tensorflow项目中--FLAGS=tf.flags.FLAGS
    霍夫变换--直线,圆的识别
    利用手写数字识别项目详细描述BP深度神经网络的权重学习
    安装Tensorflow
    安装Anaconda
    关于hibernate查询映射时无法反序列化问题
    postgresql安装之后修改默认用户密码
    中文乱码之springboot框架中两工程之间参数传递乱码
    springboot注解小记1
    springboot开发笔记
  • 原文地址:https://www.cnblogs.com/wwb0111/p/3098956.html
Copyright © 2011-2022 走看看