怎样实现强制关机(50分)

  • 主题发起人 主题发起人 nick4309
  • 开始时间 开始时间
N

nick4309

Unregistered / Unconfirmed
GUEST, unregistred user!
在有未保存的文档的情况下(不保存),怎样实现强制关机。谢谢!
 
抢分啊!!!
ExitWindowsEx(EWX_SHUTDOWN |EWX_FORCE, 0);

完整VC程序如下,您可以参考一下,其实直接用上面那个函数也足够了。
void CHahaView::OnShutdown()
{
HANDLE hToken;
TOKEN_PRIVILEGES tkp;
DWORD dwVersion;

dwVersion = GetVersion(); //获得Windows NT或Win32的版本号
if (dwVersion < 0x80000000)
{// Windows NT
OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken);
LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME,&tkp.Privileges[0].Luid);

tkp.PrivilegeCount = 1; // 设置一个权限
tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;

AdjustTokenPrivileges(hToken, FALSE, &tkp, 0,(PTOKEN_PRIVILEGES)NULL, 0);

ExitWindowsEx(EWX_SHUTDOWN |EWX_FORCE, 0);
}
else
{
ExitWindowsEx(EWX_SHUTDOWN |EWX_FORCE ,0);
}
}
 
代码:
unit MainFrm;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    btnShutDown: TButton;
    procedure btnShutDownClick(Sender: TObject);
  private
    { Private declarations }
    procedure AdjustToken;
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.AdjustToken;
var
  hdlProcessHandle : Cardinal;
  hdlTokenHandle : Cardinal;
  tmpLuid : Int64;
 // tkpPrivilegeCount : Int64;
  tkp : TOKEN_PRIVILEGES;
  tkpNewButIgnored : TOKEN_PRIVILEGES;
  lBufferNeeded : Cardinal;
  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;

procedure TForm1.btnShutDownClick(Sender: TObject);
begin
  AdjustToken;
  ExitWindowsEx((EWX_SHUTDOWN Or EWX_FORCE Or EWX_POWEROFF), $FFFF);
end;

end.
 
授之以鱼,不如授之以渔!

nick4309:
其实,不管是VC或DELPHI,只要是在WINDOWS下开发的东西,强制关机或注销等都是一个
API函数:ExitWindowsEx()

具体参数我不列出来了,你到WINSDK中去搜索一下就会找到,写得很详细!

额外废话:其实很多东西在这样的帮助系统中有比较完整的解释,你应该学会自己搜寻的
能力或技巧!
 
各位大虾,我试了,好像在win2k/xp下不行。
 
不是吧,,我在一个项目中就实现了,,,这个项目在win2000professional下开发的
 
参照juli提供的方法,win2000绝对没问题,我做过的
 
我在xp下运行,始终关不了,桌面没了就不响应了,不知是怎么回事
 
我用的XP,关机很正常,而且我做过一个程序就用了这些code,
在各个版本的Windows中都很正常。
至于你的情况,我就不清楚了,抱歉。
 
to nick4309:可能是ExitWindowsEx的第二个参数的问题。
 
把你的EMAIL告诉我。我把自己写的一个程序发给你就明白了。
www@ieisz.com
 
zhouyong112@sohu.com
谢谢!
 
多人接受答案了。
 
后退
顶部