我用ExitWindows想让计算机关机,但计算机老是注销就是不关机

bomb_hero 2001-03-02 01:30:00
BC 3.1 Windows API手册上说用
ExitWindows(2,0)可以关机,但也许是2000的原故,只能注销,不能关机。
那位大哥帮帮我,告诉我在Windows 2000下怎么使系统关机。
我使用BCB5.0。
...全文
320 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
TopCat 2001-03-08
  • 打赏
  • 举报
回复
//下面的函数实现在NT/2000下关机的功能,其基本思想是先申请关机权限,然后调用
//ExitWindowsEx关机
int CYinhangDlg::ShutDown()
{
OSVERSIONINFO osv;
osv.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
GetVersionEx(&osv);
if(osv.dwPlatformId == VER_PLATFORM_WIN32_NT)
{
HANDLE hProcess,hToken;
TOKEN_PRIVILEGES Privileges;
LUID luid;
//获得当前的进程号
hProcess=GetCurrentProcess();
//获得进程的存取令牌. 第二个参数为TOKEN_ADJUST_PRIVILEGERS时,
//获得可调整的存取令.
OpenProcessToken(hProcess,TOKEN_ADJUST_PRIVILEGES,&hToken);
Privileges.PrivilegeCount=1;
//查找关机权限的ID号
LookupPrivilegeValue(NULL,SE_SHUTDOWN_NAME,&luid);
Privileges.Privileges[0].Luid=luid;
Privileges.Privileges[0].Attributes=SE_PRIVILEGE_ENABLED;
//调整存取权限, 如果不成功, 本函数返回 -1
if (!AdjustTokenPrivileges(hToken,FALSE,&Privileges,NULL,NULL,NULL))
return -1;
}

ExitWindowsEx(EWX_SHUTDOWN,0);

return 0;

}
VC++ 6.0, WinNT 4.0下可行, 2000下应该没问题
thcay 2001-03-08
  • 打赏
  • 举报
回复
98和NT(Win 2000)的区别就是:
98安全性能不如NT(2000)
在NT(2000)中,普通线程(进程)是没有关闭计算机等Administrator才有的权利.
必须通过获得权利的函数才可以执行ExitWindowsEx()
yiwei 2001-03-07
  • 打赏
  • 举报
回复
给分给分,答案已经出来了!!!!
bomb_hero 2001-03-07
  • 打赏
  • 举报
回复
不知道为什么,我除了使用EWX_FORCE参数可以注销以外,其他的参数都没有反应。
xjcook 2001-03-04
  • 打赏
  • 举报
回复
2000下不可以
我早就试验过了
98下好好的程序,2000下就不行了
knf 2001-03-04
  • 打赏
  • 举报
回复
在2000下要多加一段调整程序,我以前在VB下做过的,贴出来参考,大家把它改一下。
在98下,不需要调用这段程序,但调了也不会出错。

Private Sub AdjustToken()
Dim hdlProcessHandle As Long
Dim hdlTokenHandle As Long
Dim tmpLuid As LUID
Dim tkp As TOKEN_PRIVILEGES
Dim tkpNewButIgnored As TOKEN_PRIVILEGES
Dim lBufferNeeded As Long

hdlProcessHandle = GetCurrentProcess()
OpenProcessToken hdlProcessHandle, (TOKEN_ADJUST_PRIVILEGES Or TOKEN_QUERY), hdlTokenHandle

' Get the LUID for shutdown privilege.
LookupPrivilegeValue "", "SeShutdownPrivilege", tmpLuid
tkp.PrivilegeCount = 1 ' One privilege to set
tkp.Privileges(0).pLuid = tmpLuid
tkp.Privileges(0).Attributes = SE_PRIVILEGE_ENABLED

' Enable the shutdown privilege in the access token of this process.
AdjustTokenPrivileges hdlTokenHandle, False, tkp, Len(tkpNewButIgnored), tkpNewButIgnored, lBufferNeeded
End Sub
夭夭 2001-03-03
  • 打赏
  • 举报
回复
在NT和9X下是不一样的了

DWORD dwVersion = GetVersion();// Get major and minor version numbers of Windows
if (dwVersion < 0x80000000) // Windows NT
{
HANDLE hToken;
TOKEN_PRIVILEGES tkp;
OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken);
LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME,&tkp.Privileges[0].Luid);
tkp.PrivilegeCount = 1; // one privilege to set
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_FORCE+EWX_REBOOT,0);
}
else if(temp.SubString(1,8)=="shutdown")
{
ExitWindowsEx(EWX_SHUTDOWN,0);
wwwunix 2001-03-02
  • 打赏
  • 举报
回复
用下面的语句可以,这是从我的程序中抽出来的。我用了很久了。
ExitWindowsEx(EWX_POWEROFF|EWX_SHUTDOWN,0);
xrbeck 2001-03-02
  • 打赏
  • 举报
回复
ExitWindowsEx(EWX_POWEROFF|EWX_FORCE,0);
注意不能在IDE环境中。只能MAKE成EXE文件。
然后单独执行。
wjzhuang 2001-03-02
  • 打赏
  • 举报
回复
代码如下:
void __fastcall TForm1::Button1Click(TObject *Sender)
{
ExitWindowsEx(EWX_SHUTDOWN, 0);
}
参数:
EWX_FORCE Forces programs to close without sending WM_QUERYENDSESSION
and WM_ENDSESSION messages to notify them that Windows is
shutting down. With any of the other flags, programs have the
power to abort the shut down.
EWX_LOGOFF Closes all programs and then logs the user off.
EWX_POWEROFF Powers down the computer if it supports it.
EWX_REBOOT Reboots the machine.
EWX_SHUTDOWN Shuts the machine off without restarting it.
kwhei 2001-03-02
  • 打赏
  • 举报
回复
你在WINDOWS98或2000上,只须使用ExitWindowsEx函数就可以了。详细参数可以看帮助。!
knf 2001-03-02
  • 打赏
  • 举报
回复
我记得好像EWX_REBOOT=2吧?用下面的函数
ExitWindowsEx(EWX_POWEROFF,0);
ExitWindowsEx(EWX_REBOOT,0);
ExitWindowsEx(EWX_SHUTDOWN,0);

还有一个:EWX_FORCE=4
knf 2001-03-02
  • 打赏
  • 举报
回复
我记得好像EWX_REBOOT=2吧?用下面的函数
ExitWindowsEx(EWX_POWEROFF,0);
ExitWindowsEx(EWX_REBOOT,0);
ExitWindowsEx(EWX_SHUTDOWN,0);
qianliu 2001-03-02
  • 打赏
  • 举报
回复
应该用这个API:
ExitWindowsEx(EWX_POWEROFF)

ExitWindows(0,0)
的确只能: log off

13,826

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder相关内容讨论区
社区管理员
  • 基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧