• 关机与禁止关机代码


    今天抽空,写完了定时关机程序的代码,测试了一下,还不错,以前写过个禁止关机的程序,用来测试一下,看哪个强,先运行禁止关机的程序,用Windows xp的关闭计算机试了一下,关不了.

    代码很少:

    private
           procedure QueryEndSession(var Msg:TMessage);Message WM_QueryEndSession;


    procedure TForm1.QueryEndSession(var Msg:TMessage);
    begin
      Msg.Result:=0;
    end;
    就是收到关机消息后返回0,告知还不能关机.

    而定时关机这边主要是用这条API指令来关机:

      BOOL   ExitWindowsEx(  
      UINT   uFlags,   //   关闭操作  
      DWORD   dwReserved   //   保留,0即可.  
    )   ;  

    其中参数uFlags的取值及其含义:  
    EWX_FORCE   在紧急情况下强制关机。  
    EWX_LOGOFF   以其他用户身份登录。  
    EWX_POWEROFF   关闭系统并关闭电源。  
    EWX_REBOOT   重新启动。  
    EWX_SHUTDOWN   安全地关机。 

    测试了一下,在开启了禁止关机程序的情况下,使用EWX_SHUTDOWN,EWX_POWEROFF都不能关机.只有加上EWX_FORCE这个参数,禁止关机的程序不起作用了.

    //关机代码,CMD用 EWX_FORC可以突破禁止关机.
    procedure TForm1.CloseWin(cmd:Cardinal);
    var
          VerInfo:TOSVersionInfo;  
          hToken:THANDLE;
          tkp:TOKEN_PRIVILEGES;  
          Nothing:Cardinal;  
      begin  
          VerInfo.dwOSVersionInfoSize:=SizeOf(VerInfo);  
          GetVersionEx(VerInfo);  
          if   VerInfo.dwPlatformId=VER_PLATFORM_WIN32_NT   then  
          Begin  
              OpenProcessToken(GetCurrentProcess,TOKEN_ADJUST_PRIVILEGES   or   TOKEN_QUERY,hToken);  
              LookupPrivilegeValue(nil,'SeShutdownPrivilege',tkp.Privileges[0].Luid);  
              tkp.PrivilegeCount:=   1;  
              tkp.Privileges[0].Attributes:=   SE_PRIVILEGE_ENABLED;  
              AdjustTokenPrivileges(hToken,   FALSE,   tkp,   0,nil,   Nothing);  
          End;
           ExitWindowsEx(CMD,0);

      end;

  • 相关阅读:
    宝宝咳嗽
    如何查看 oracle 官方文档
    00 序 建立环境
    09 变量重游
    【TYVJ】1359
    【COGS】147. [USACO Jan08] 架设电话线(二分+spfa)
    【wikioi】1904 最小路径覆盖问题(最大流+坑人的题+最小路径覆盖)
    【wikioi】1034 家园(最大流+特殊的技巧)
    【BZOJ】1040: [ZJOI2008]骑士(环套树dp)
    【POJ】2234 Matches Game(博弈论)
  • 原文地址:https://www.cnblogs.com/hssbsw/p/2533101.html
Copyright © 2020-2023  润新知