'API声明
Public Declare Function RtlAdjustPrivilege& Lib "ntdll" (ByVal Privilege&, ByVal NewValue&, ByVal NewThread&, OldValue&)
Public Declare Function NtShutdownSystem& Lib "ntdll" (ByVal ShutdownAction&)
    Public Const SE_SHUTDOWN_PRIVILEGE& = 19
    Public Const shutdown& = 0
    Public Const RESTART& = 1
    Public Const POWEROFF& = 2'过程
Sub TurboShutdown()
    RtlAdjustPrivilege SE_SHUTDOWN_PRIVILEGE, 1, 0, 0
    NtShutdownSystem shutdown '关机
    'NtShutdownSystem restart '重启动
    'NtShutdownSystem poweroff '关机
End Sub'调用
call turboshutdown
我的问题如是,希望高手能把此VB代码译成Delphi!

解决方案 »

  1.   

    怎么没高手回帖呢?路过的各位兄弟帮忙顶贴,回复者均给分!UP...UP...UP...UP..UP...
      

  2.   

    Windows操作系统快速关机之谜
    总有人在抱怨Windows的关机是如何的缓慢,实际上Windows本身的关机速度已经很快的了。问题主要出在用户安装的程序上面,由于一些设计不好的应用程序或驱动程序的问题,造成了关机上的延迟。针对这个问题,网络上出现了类似于下面的技巧:  打开任务管理器,按住“Ctrl”键的同时,再单击任务管理器窗口中的菜单“关机→关闭”命令时,系统会快速地被关闭,同样,在按住“Ctrl”键时,选择其他命令(例如重新启动)时,也会达到快速执行该命令的目的。  同时,也出现了像SuperFast Shutdown一样的快速关机软件。  在讨论上述技巧原理之前,先说说Windows是如何关机的:Windows关机步骤涉及到Windows多个组件和多个过程,简单的说,Windows的关机步骤不是大多数人认为的那么简单。基本的过程是这样的:  1. 用户发起关机指令以后,发起关机指令的程序会通知Windows子系统CSRSS.EXE,CSRSS.EXE收到通知以后会和Winlogon.EXE做一个数据交换,接着由Winlogon.EXE通知CSRSS.EXE开始关闭系统的流程 。  2. CSRSS.EXE收到Winlogon.EXE的通知以后,会依次查询拥有顶层窗口的用户进程,让这些用户进程退出。如果某一个用户进程在一个默认的超时时间5000毫秒(可以通过修改注册表键值HKEY_CURRENT_USER\Cont rol Panel\Desktop\ HungAppTimeout设定超时时间)内没有退出的话,Windows会显示一个结束任务对话框用于询问用户是否结束这个任务。默认情况下将显示这个对话框并一直保持而不会自动关闭。对于控制台程序来说,基本情况类似,只不过Windows使用HK EY_CURRENT_USER\Control Panel\Desktop\ WaitToKillAppTimeout值来设置超时时间。  3. 接着是轮到终止系统进程了。系统进程包括SMSS.EXE、Winlogon.EXE、Lsass.EXE等。Windows在终止系统进程的时候并不像终止用户进程那样如果无法在规定时间内终止则提示用户,而是跳过这个进程,去执行下一个系统 进程的终止操作。使用的超时时间和第2步使用的时间相同。  上述3个步骤是整个Windows关机过程中最耗费时间的一段,大多数关机缓慢的原因都是因为这3个步骤引起的。完成前3个步骤以后,进入了关机操作的第4个阶段,也是最后一个阶段。  4. Winlogon.EXE调用一个原生API函数NtShutdownSystem()来命令系统执行后面的扫尾工作。在这个阶段里面,Windows执行子系统会完成最后的关机操作,例如:设备驱动在这个阶段里面完成一些驱动设定的特殊操作; 也是在这个阶段,配置管理系统将被修改过的注册表数据会写道磁盘里面。等除了电源管理以后的全部子系统完成退出以后,电源管理完成最后的操作:如重启、关机等。  了解了Windows的关机流程以后,下面分析一下前面说的快速关机操作是怎么完成的。先分析一下SuperFast Shutdown的原理,SuperFast Shutdown是使用Visual Basic编写的,体积很小,就15KB,经过分析以后得出一个令人惊讶的结论:SuperFast Shutdown首先使用RtlAdjustPrivilege()提升自己的权限,然后直接调用NtShutdownSystem() 函数来完成关机过程。由于跳过了最为耗费时间的前3个步骤而直接进入第4个步骤,所以造成了能够很快关机的假象。  再看看任务管理器的快速关机是如何实现的:分析结果也是类似于SuperFast Shutdown的原理,也是通过省略一些步骤来加快关机的速度。  那么,为什么在快速关机以后会出现设置丢失的情况呢?原因在于前3个步骤里面有一个让进程正常退出的可能。大多数软件在编写的时候会把一些设置保存在自己私有的内存空间里面,当软件关闭的时候才把这些设置回写到特定的地方,如注册表或某个配置文件里面 。而关机操作的第4步并没有提供一种途径能够让这些设置记录下来,因为这个阶段Windows已经认为前面所有必须经过的流程已经完成,剩下的就是Windows核心组件的退出的问题了。在这种情况下,使用快速关机导致设置丢失也不足为怪了。  因此,为了你系统的健康,关机还是按照正常顺序来,数据的安全性往往比节省的那几十秒钟重要的多。
      

  3.   

    关机的代码可以参考:
    http://antly.com/Article/Print.asp?ArticleID=313
      

  4.   

    非常感谢 liangqingzhi(老之) 的回复,这个是Delphi正常关机的代码,我希望得到是快速关机的!再次感谢!
      

  5.   


    我的提问同时也真心希望和大家一道学习,我把我所知道的都列出来!我有一个这样快速关机的程序(VB编写的), 只是不知道用Delphi怎么写
    如果哪位朋友想看看这个程序,请留下Email以下是 liangqingzhi(老之) 提供的代码:
    这只是正常关机代码,不是一秒关定义全局变量 send:integer;
    定义过程如下:procedure tform1.ShutDown;
      procedure AdjustToken(); //获取关机控制权
      var
        hdlProcessHandle, hdlTokenHandle, lBufferNeeded: Cardinal;
        tmpLuid: Int64;
      //tkpPrivilegeCount: Int64;
        tkp, tkpNewButIgnored: TOKEN_PRIVILEGES;
        Privilege: array[0..0] of _LUID_AND_ATTRIBUTES;
      begin
        hdlProcessHandle := GetCurrentProcess;
        OpenProcessToken(hdlProcessHandle,
          (TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY),
           hdlTokenHandle);
      // Get the LUID for shutdown privilege.
        LookupPrivilegeValue('', 'SeShutdownPrivilege', tmpLuid);
        Privilege[0].Luid := tmpLuid;
        Privilege[0].Attributes := SE_PRIVILEGE_ENABLED;
        tkp.PrivilegeCount := 1; // One privilege to set
        tkp.Privileges[0] := Privilege[0];
      // Enable the shutdown privilege in the access token of this process.
        AdjustTokenPrivileges(hdlTokenHandle,
          False,
          tkp,
          Sizeof(tkpNewButIgnored),
          tkpNewButIgnored,
          lBufferNeeded);
      end;
    begin
      AdjustToken;
      case send of
        1: ExitWindowsEx(EWX_FORCE, 0); //在紧急情况下强制关机。 ;
        2: ExitWindowsEx(EWX_LOGOFF, 0); //以其他用户身份登录。 ;
        3: ExitWindowsEx(EWX_POWEROFF, 0); //关闭系统并关闭电源。
        4: if application.MessageBox('是否重新启动', '重启计算机提示框', 1+48)=1 then  //idok
                   begin
                      showmessage('reboot');
                      ExitWindowsEx(EWX_REBOOT, $FFFF); //重启操作系统
                   end
                   else
                     exit;
        5: if application.MessageBox('是否关闭', '关闭计算机提示框', 1+48)=1 then  //idok
                   begin
                      showmessage('close');
                      ExitWindowsEx(EWX_SHUTDOWN, $FFFF); //关机;
                   end
                   else
                     exit;
      else
        EXIT;
      end;
    end;调用方法如下:procedure TForm1.Button1Click(Sender: TObject);
    begin
    send:=3;
    ShutDown;
    end;
      

  6.   

    刚刚在XP测试通过的:(郁闷,电脑重启)unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls;type
      TForm1 = class(TForm)
        Button1: TButton;
        procedure Button1Click(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end; Const SE_SHUTDOWN_PRIVILEGE = 19;
     Const shutdown = 0;
     Const RESTART = 1;
     Const POWEROFF = 2;var
      Form1: TForm1;implementation{$R *.dfm}
    function RtlAdjustPrivilege(dwPrivilegeId : DWORD ;bSet: Bool ; AdjType : Bool; Unc : PBool): word ; stdcall ; external 'ntdll';function NtShutdownSystem(ShutdownAction:integer):word;stdcall;external'ntdll.dll';procedure TForm1.Button1Click(Sender: TObject);
    var a:PBool;
    begin
      RtlAdjustPrivilege(SE_SHUTDOWN_PRIVILEGE, True, False, a);
      NtShutdownSystem(RESTART);
    end;end.
      

  7.   

    谢谢liangqingzhi(老之)的答案,这正是我要的,大家注意这个关机程序对所有数据都不会保存,建议大家慎用,因为我的机子有还原卡所以不会出现上述问题!给分了!