在MFC中怎么通过点击一个按钮重启计算机

lsxsxs 2010-04-26 07:27:39
有没有一种方法,点击了一个按钮之后就让计算机重启。要在按钮事件中添加什么代码啊。我加了个
ExitWindowsEx(EWX_REBOOT, 0)或者 ExitWindowsEx(EWX_REBOOT, EWX_FORCE)都不行,只是在我关闭生成的窗口之后把我的VS2008给关了。
...全文
393 23 打赏 收藏 转发到动态 举报
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
Lytton_jing 2010-04-28
  • 打赏
  • 举报
回复
学习学习
lsxsxs 2010-04-28
  • 打赏
  • 举报
回复
问题已解决,谢谢.就是权限的问题
这不是鸭头 2010-04-27
  • 打赏
  • 举报
回复
提升权限
dns007 2010-04-27
  • 打赏
  • 举报
回复
路过 mark~ 随便帮顶!!!
wilson_hz 2010-04-27
  • 打赏
  • 举报
回复
void CXXXDlg::ReStart(DWORD verInfo)
{
try
{
//如果获取到的系统dwMajorVersion值大于等于5,表示为NT以上操作系统,需提升进程权限
if(verInfo>=5)
{
HANDLE ToHandle;
TOKEN_PRIVILEGES tkp;
//打开本进程访问信令
if(OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES|TOKEN_QUERY,&ToHandle))
{
//修改本进程权限
LookupPrivilegeValue(NULL,SE_SHUTDOWN_NAME,&tkp.Privileges[0].Luid);
tkp.PrivilegeCount=1;
tkp.Privileges[0].Attributes=SE_PRIVILEGE_ENABLED;
//通知系统已修改
AdjustTokenPrivileges(ToHandle,FALSE,&tkp,0,(PTOKEN_PRIVILEGES)NULL,0);
//获得权限后关闭计算机,要实现注销或重启则对应EWX_LOGOFF,EWX_REBOOT
ExitWindowsEx(EWX_REBOOT|EWX_FORCE,0);
}
}
//否则为98以下,直接调用ExitWindowsEx函数即可
else
{
ExitWindowsEx(EWX_SHUTDOWN|EWX_FORCE,0);
}
}
catch(...)
{
//出现任何错误则返回
printf("关机失败,请确认程序是否被拦截或具有管理权限!");
return;
}
}
DWORD CXXXDlg::GetVerInfo()
{
OSVERSIONINFO osver={sizeof(OSVERSIONINFO)};
GetVersionEx(&osver);
return osver.dwMajorVersion;
}
void CxxxDlg::OnRestart()
{
// TODO: Add your control notification handler code here
ReStart(GetVerInfo());
}


完整的重启方法,我自己就是这样做的,没问题。
jackcct 2010-04-27
  • 打赏
  • 举报
回复
权限问题
SullenSun 2010-04-27
  • 打赏
  • 举报
回复
void CShutRebootDlg::OnShutdown()
{
// TODO: Add your control notification handler code here
int nvalue= AfxMessageBox("是否真的要关闭计算机?",4+32+256);
if(nvalue==IDYES) //用户按下了"是"按钮
{
OSVERSIONINFO osv;
osv.dwOSVersionInfoSize = sizeof OSVERSIONINFO;
GetVersionEx(&osv);//获取操作系统的版本
if(VER_PLATFORM_WIN32_NT == osv.dwPlatformId)
{
// 如果运行在NT/XP平台,必须先取得权限
HANDLE hProcess, hToken;
TOKEN_PRIVILEGES Privileges;
LUID luid;
hProcess=GetCurrentProcess();
OpenProcessToken(hProcess, TOKEN_ADJUST_PRIVILEGES, &hToken);
Privileges.PrivilegeCount = 1;
LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME, &luid);
Privileges.Privileges[0].Luid = luid;
Privileges.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
AdjustTokenPrivileges(hToken, FALSE, &Privileges, NULL, NULL, NULL);
}
ExitWindowsEx(EWX_SHUTDOWN,0);//关闭计算机
}
}
你妹的特盗不 2010-04-27
  • 打赏
  • 举报
回复
直接执行系统命令 shutdown -r -t 0
马上系统就重启了
hzy694358 2010-04-27
  • 打赏
  • 举报
回复
权限问题
顶6楼
liuharris 2010-04-27
  • 打赏
  • 举报
回复
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;
tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
AdjustTokenPrivileges(hToken, FALSE, &tkp, 0, (PTOKEN_PRIVILEGES)NULL, 0);
if (strAction=="自动关机") ExitWindowsEx(EWX_POWEROFF, 0);
if (strAction=="自动重启") ExitWindowsEx(EWX_REBOOT, 0);
if (strAction=="自动注销") ExitWindowsEx(EWX_LOGOFF, 0);
Eleven 2010-04-27
  • 打赏
  • 举报
回复
BOOL ShutDownComputer()
{
HANDLE hToken;
TOKEN_PRIVILEGES tkp = {0};

if(!OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken))
{
return FALSE;
}

if(LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME, &tkp.Privileges[0].Luid))
{
return FALSE;
}

tkp.PrivilegeCount = 1;
tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;

if(AdjustTokenPrivileges(hToken, FALSE, &tkp, 0, (PTOKEN_PRIVILEGES)NULL, 0))
{
return FALSE;
}

if(!ExitWindowsEx(EWX_SHUTDOWN | EWX_FORCE, 0))
{
return FALSE;
}
return TRUE;
}
Eleven 2010-04-27
  • 打赏
  • 举报
回复
MSDN上有例子程序。。。
wangli820 2010-04-27
  • 打赏
  • 举报
回复
BOOL MySystemShutdown()
{
HANDLE hToken;
TOKEN_PRIVILEGES tkp;

// Get a token for this process.

if (!OpenProcessToken(GetCurrentProcess(),
TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken))
return( FALSE );

// Get the LUID for the shutdown privilege.

LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME,
&tkp.Privileges[0].Luid);

tkp.PrivilegeCount = 1; // one privilege to set
tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;

// Get the shutdown privilege for this process.

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

if (GetLastError() != ERROR_SUCCESS)
return FALSE;

// Shut down the system and force all applications to close.

if (!ExitWindowsEx(EWX_SHUTDOWN | EWX_FORCE,
SHTDN_REASON_MAJOR_OPERATINGSYSTEM |
SHTDN_REASON_MINOR_UPGRADE |
SHTDN_REASON_FLAG_PLANNED))
return FALSE;

return TRUE;
}
Inloveing1124 2010-04-27
  • 打赏
  • 举报
回复
不懂的人~~路过
dukong123 2010-04-27
  • 打赏
  • 举报
回复
路过,学习下
callesp 2010-04-27
  • 打赏
  • 举报
回复
权限问题

提升进程权限
heword456 2010-04-27
  • 打赏
  • 举报
回复
之前也碰到过权限的问题,同样想了解,帮顶。。。
zgl7903 2010-04-26
  • 打赏
  • 举报
回复
不好意思 刚才那个是关机
用UINT FFlag = EWX_REBOOT | EWX_FORCE;
zgl7903 2010-04-26
  • 打赏
  • 举报
回复

UINT FFlag = EWX_SHUTDOWN | EWX_POWEROFF | EWX_FORCE;

// Get version info to determine operation
OSVERSIONINFO osvi;
osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
if (GetVersionEx(&osvi))
{
// Determine the platform
if (osvi.dwPlatformId == VER_PLATFORM_WIN32_NT)
{
HANDLE hToken;
TOKEN_PRIVILEGES tkp;

// Windows NT 3.51, Windows NT 4.0, Windows 2000,
// Windows XP, or Windows .NET Server
if (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(FFlag, 0);
lsxsxs 2010-04-26
  • 打赏
  • 举报
回复
我在网上看了一下,我那个之所以不行,是因为那个API只是在Win9X下有用,不过一楼的兄弟,
int nResult = RtlAdjustPrivilege(SE_SHUTDOWN_PRIVILEGE, true, true, &nEn);
这句话报异常,是怎么回事呢
加载更多回复(3)

16,473

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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