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 );
}