请问如何实现:单击一个按纽,实现关机,重启,注销??
都需要那些函数??
都需要那些函数??
解决方案 »
- CImageList加载大位图里一系列小图标的问题
- 关于select和WSAEventSelect
- vc++如何调用C++BUIDER 写的DLL
- 我的一个vc程序,运行可以通过,但调试却出错,怎么回事?
- 打印机仿真?
- 求教各位大虾!如何在VC下读写磁盘FAT和分区表,我具体要做些什么呢?
- 2000元求购原代码!是关于编辑avi文件的!
- ADSI操作DNS的问题!
- 我现在正在学候Sir的《深入浅出MFC》,不知还有多少同志,我建议我们经常讨论一下心得,如何???!!!
- vc2005运行vc6程序时出错,error LNK2019: 无法解析的外部符号
- 关于DllGetClassObject的疑问!
- 有关键盘钩子的问题,up者有分
UINT uFlags, // shutdown operation
DWORD dwReserved // reserved
);BOOL ExitWindows(
DWORD dwReserved, // reserved; must be zero
UINT uReserved // reserved; must be zero
);
可以注销,关机,重启,具体查MSDN吧。
void Shutdown9x()
{
switch (shutdown)
{
case 0:
ExitWindowsEx(EWX_SHUTDOWN, 0L);
break;
case 1:
ExitWindowsEx(EWX_REBOOT, 0L);
break;
default:
WinExec("Exit To Dos.pif", SW_SHOWNORMAL);
break;
}
}
BOOL ShutdownNT()
{
HANDLE hToken;
TOKEN_PRIVILEGES tkp;
if (!OpenProcessToken(GetCurrentProcess(),
TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken)) return FALSE;
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);
if (GetLastError() != ERROR_SUCCESS) return FALSE;
if (shutdown == TRUE)
ExitWindowsEx(EWX_SHUTDOWN, 0L);
else ExitWindowsEx(EWX_REBOOT, 0L);
return TRUE;
}其实都是用ExitWindowsEx()退出的
shutdown表示是退出还是重起
2k下要做都一些安全性的东西
只是
//判断系统类型
BOOL IsWindowsNT()
{
BOOL bRet = FALSE;
BOOL bOsVersionInfoEx;
OSVERSIONINFOEX osvi; // Try calling GetVersionEx using the OSVERSIONINFOEX structure,
// If that fails, try using the OSVERSIONINFO structure.
ZeroMemory(&osvi, sizeof(OSVERSIONINFOEX));
osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX); if( !(bOsVersionInfoEx = GetVersionEx ((OSVERSIONINFO *) &osvi)) )
{
// If OSVERSIONINFOEX doesn't work, try OSVERSIONINFO.
osvi.dwOSVersionInfoSize = sizeof (OSVERSIONINFO);
if (! GetVersionEx ( (OSVERSIONINFO *) &osvi) )
return bRet;
} if (osvi.dwPlatformId == VER_PLATFORM_WIN32_NT && osvi.dwMajorVersion <= 4)
{
bRet = TRUE;
} return bRet;
}BOOL IsWindows2k()
{
BOOL bRet = FALSE;
BOOL bOsVersionInfoEx;
OSVERSIONINFOEX osvi; // Try calling GetVersionEx using the OSVERSIONINFOEX structure,
// If that fails, try using the OSVERSIONINFO structure.
ZeroMemory(&osvi, sizeof(OSVERSIONINFOEX));
osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX); if( !(bOsVersionInfoEx = GetVersionEx ((OSVERSIONINFO *) &osvi)) )
{
// If OSVERSIONINFOEX doesn't work, try OSVERSIONINFO.
osvi.dwOSVersionInfoSize = sizeof (OSVERSIONINFO);
if (! GetVersionEx ( (OSVERSIONINFO *) &osvi) )
return bRet;
} if (osvi.dwPlatformId == VER_PLATFORM_WIN32_NT && osvi.dwMajorVersion >= 5)
{
bRet = TRUE;
} return bRet;
}
你不行就不要写这么多了
就直接
HANDLE hToken;
TOKEN_PRIVILEGES tkp;
if (!OpenProcessToken(GetCurrentProcess(),
TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken)) return FALSE;
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);
if (GetLastError() != ERROR_SUCCESS) return FALSE;
//不考虑重起的情况了
ExitWindowsEx(EWX_SHUTDOWN, 0L);
return TRUE;