reboot.exe的制作过程
编程工具:Visual C++.NET 2003
程序员:黄江斌
程序功能:关闭、重启计算机、注销当前用户。
开发时间:2005年8月27日
1、新建工程。文件 -> 新建 -> 项目,从中选择MFC(MFC应用程序),输入工程名Reboot
2、定制应用程序类型。应用程序类型:基于对话框。
其它设置按默认。
3、布置程序界面。 添加的控件有
控件
ID
Caption
其它属性
Static Box
IDC_STATIC
Radio Box 1
IDC_OPTYPE
关闭计算机
Group = True
Radio Box 2
IDC_RADIO2
重新启动
Radio Box 3
IDC_RADIO3
立即关闭
Radio Box 4
IDC_RADIO4
注销当前用户
Button1
IDC_BTNOK
确定
Button2
IDC_BTNCANCEL
取消
界面如下图:
4、添加变量。 在CrebootDlg类中添加m_nOpType变量(控件变量、IDC_OPTYPE、Value、BOOL)。
5、添加代码。void CRebootDlg::OnBnClickedBtnok()
{
// TODO: 在此添加控件通知处理程序代码
HANDLE hToken;
TOKEN_PRIVILEGES tkp;
DWORD dwVersion;
//得到Windows NT或Win32的版本号
dwVersion = GetVersion();
UpdateData( TRUE );
switch( m_nOpType )
{
case 0:
//关闭计算机
if( dwVersion < 0x080000000 )
{
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 , 0 );
}
else
{
ExitWindowsEx( EWX_SHUTDOWN , 0 );
}
break;
case 1:
//重启计算机
if( dwVersion < 0x080000000 )
{
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_REBOOT , 0 );
}
else
{
ExitWindowsEx( EWX_REBOOT , 0 );
}
break;
case 2:
//重启计算机
if( dwVersion < 0x080000000 )
{
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_REBOOT | EWX_FORCE , 0 );
}
else
{
ExitWindowsEx( EWX_REBOOT | EWX_FORCE , 0 );
}
break;
case 3:
//注销当前用户
ExitWindowsEx( EWX_LOGOFF , 0 );
break;
}
SendMessage( WM_CLOSE , 0 , 0 );
}
void CRebootDlg::OnBnClickedBtncancel()
{
// TODO: 在此添加控件通知处理程序代码 SendMessage( WM_CLOSE , 0 , 0 );
}