楼主不要听他们瞎扯!他们的方法都不行的. 我给个方法:通用的! 因为我是模拟系统关机! 楼主要给分哦! 初始化时:SetTimer(1, 200, NULL); 重载这个函数:void CXXXXDlg::OnTimer(UINT nIDEvent) { // TODO: Add your message handler code here and/or call default if (nIDEvent == 1) { KillTimer(nIDEvent); SetTimer(2, 200, NULL); keybd_event(VK_LWIN,0,0,0); keybd_event(VK_LWIN,0,KEYEVENTF_KEYUP,0); } else if (nIDEvent == 2) { KillTimer(nIDEvent); SetTimer(3, 200, NULL); keybd_event('U',0,0,0); keybd_event('U',0,0,0); } else if (nIDEvent == 3) { static int i = 0; KillTimer(nIDEvent); if (i < 4) { SetTimer(3, 200, NULL); keybd_event(VK_UP,0,0,0); keybd_event(VK_UP,0,KEYEVENTF_KEYUP,0); i++; } else { SetTimer(4, 200, NULL); } } else if (nIDEvent == 4) { KillTimer(nIDEvent); SetTimer(5, 200, NULL); keybd_event(VK_DOWN,0,0,0); keybd_event(VK_DOWN,0,KEYEVENTF_KEYUP,0); } else if (nIDEvent == 5) { KillTimer(nIDEvent); keybd_event(VK_RETURN,0,0,0); keybd_event(VK_RETURN,0,KEYEVENTF_KEYUP,0); } CDialog::OnTimer(nIDEvent); }
哦,那2000中的关机一般就是这个函数,它有时可以关机,但关不了电源.CSDN上这种帖子有很多,但都解决不了.我的这个方法虽然土点,但对大多数系统还是可以解决的.因为我是模拟系统关机呀!^_^ ExitWindowsEx The ExitWindowsEx function either logs off the current user, shuts down the system, or shuts down and restarts the system. It sends the WM_QUERYENDSESSION message to all applications to determine if they can be terminated. BOOL ExitWindowsEx( UINT uFlags, // shutdown operation DWORD dwReserved // reserved );
Parameters uFlags Specifies the type of shutdown. This parameter must include one of the following values: Value Meaning EWX_LOGOFF Shuts down all processes running in the security context of the process that called the ExitWindowsEx function. Then it logs the user off. EWX_POWEROFF Shuts down the system and turns off the power. The system must support the power-off feature. Windows NT: The calling process must have the SE_SHUTDOWN_NAME privilege. For more information, see the following Res section.
EWX_REBOOT Shuts down the system and then restarts the system. Windows NT: The calling process must have the SE_SHUTDOWN_NAME privilege. For more information, see the following Res section.
EWX_SHUTDOWN Shuts down the system to a point at which it is safe to turn off the power. All file buffers have been flushed to disk, and all running processes have stopped. Windows NT: The calling process must have the SE_SHUTDOWN_NAME privilege. For more information, see the following Res section.
This parameter can optionally include the following values: Value Meaning EWX_FORCE Forces processes to terminate. When this flag is set, the system does not send the WM_QUERYENDSESSION and WM_ENDSESSION messages. This can cause the applications to lose data. Therefore, you should only use this flag in an emergency. EWX_FORCEIFHUNG Windows NT 5.0 and later: Forces processes to terminate if they do not respond to the WM_QUERYENDSESSION or WM_ENDSESSION message. This flag is ignored if EWX_FORCE is used. dwReserved Reserved; this parameter is ignored. Return Values If the function succeeds, the return value is nonzero.If the function fails, the return value is zero. To get extended error information, callGetLastError. Res The ExitWindowsEx function returns as soon as it has initiated the shutdown. The shutdown or logoff then proceeds asynchronously. During a shutdown or log-off operation, applications that are shut down are allowed a specific amount of time to respond to the shutdown request. If the time expires, the system displays a dialog box that allows the user to forcibly shut down the application, to retry the shutdown, or to cancel the shutdown request. If the EWX_FORCE value is specified, the system always forces applications to close and does not display the dialog box. If the EWX_FORCEIFHUNG value is specified, the system forces hung applications to close and does not display the dialog box. Console processes receive a separate notification message, CTRL_SHUTDOWN_EVENT or CTRL_LOGOFF_EVENT, as the situation warrants. A console process routes these messages to its HandlerRoutine functions, which are added and removed by calls to the SetConsoleCtrlHandler function. ExitWindowsEx sends these notification messages asynchronously; thus, an application cannot assume that the console notification messages have been handled when a call to ExitWindowsEx returns. Windows NT: To shut down or restart the system, the calling process must use theAdjustTokenPrivileges function to enable the SE_SHUTDOWN_NAME privilege. For more information about security privileges, seePrivileges. Windows 95: ExitWindowEx does not work from a console application, as it does on Windows NT. QuickInfo Windows NT: Requires version 3.1 or later. Windows: Requires Windows 95 or later. Windows CE: Unsupported. Header: Declared in winuser.h. Import Library: Use user32.lib.See Also System Shutdown Overview, System Shutdown Functions,AdjustTokenPrivileges,HandlerRoutine,SetConsoleCtrlHandler
我给个方法:通用的!
因为我是模拟系统关机!
楼主要给分哦!
初始化时:SetTimer(1, 200, NULL);
重载这个函数:void CXXXXDlg::OnTimer(UINT nIDEvent)
{
// TODO: Add your message handler code here and/or call default
if (nIDEvent == 1)
{
KillTimer(nIDEvent);
SetTimer(2, 200, NULL);
keybd_event(VK_LWIN,0,0,0);
keybd_event(VK_LWIN,0,KEYEVENTF_KEYUP,0);
}
else if (nIDEvent == 2)
{
KillTimer(nIDEvent);
SetTimer(3, 200, NULL);
keybd_event('U',0,0,0);
keybd_event('U',0,0,0);
}
else if (nIDEvent == 3)
{
static int i = 0;
KillTimer(nIDEvent);
if (i < 4)
{
SetTimer(3, 200, NULL);
keybd_event(VK_UP,0,0,0);
keybd_event(VK_UP,0,KEYEVENTF_KEYUP,0);
i++;
}
else
{
SetTimer(4, 200, NULL);
}
}
else if (nIDEvent == 4)
{
KillTimer(nIDEvent);
SetTimer(5, 200, NULL);
keybd_event(VK_DOWN,0,0,0);
keybd_event(VK_DOWN,0,KEYEVENTF_KEYUP,0);
}
else if (nIDEvent == 5)
{
KillTimer(nIDEvent);
keybd_event(VK_RETURN,0,0,0);
keybd_event(VK_RETURN,0,KEYEVENTF_KEYUP,0);
}
CDialog::OnTimer(nIDEvent);
}
ExitWindowsEx
The ExitWindowsEx function either logs off the current user, shuts down the system, or shuts down and restarts the system. It sends the WM_QUERYENDSESSION message to all applications to determine if they can be terminated. BOOL ExitWindowsEx(
UINT uFlags, // shutdown operation
DWORD dwReserved // reserved
);
Parameters
uFlags
Specifies the type of shutdown. This parameter must include one of the following values: Value Meaning
EWX_LOGOFF Shuts down all processes running in the security context of the process that called the ExitWindowsEx function. Then it logs the user off.
EWX_POWEROFF Shuts down the system and turns off the power. The system must support the power-off feature.
Windows NT: The calling process must have the SE_SHUTDOWN_NAME privilege. For more information, see the following Res section.
EWX_REBOOT Shuts down the system and then restarts the system.
Windows NT: The calling process must have the SE_SHUTDOWN_NAME privilege. For more information, see the following Res section.
EWX_SHUTDOWN Shuts down the system to a point at which it is safe to turn off the power. All file buffers have been flushed to disk, and all running processes have stopped.
Windows NT: The calling process must have the SE_SHUTDOWN_NAME privilege. For more information, see the following Res section.
This parameter can optionally include the following values: Value Meaning
EWX_FORCE Forces processes to terminate. When this flag is set, the system does not send the WM_QUERYENDSESSION and WM_ENDSESSION messages. This can cause the applications to lose data. Therefore, you should only use this flag in an emergency.
EWX_FORCEIFHUNG Windows NT 5.0 and later: Forces processes to terminate if they do not respond to the WM_QUERYENDSESSION or WM_ENDSESSION message. This flag is ignored if EWX_FORCE is used. dwReserved
Reserved; this parameter is ignored.
Return Values
If the function succeeds, the return value is nonzero.If the function fails, the return value is zero. To get extended error information, callGetLastError. Res
The ExitWindowsEx function returns as soon as it has initiated the shutdown. The shutdown or logoff then proceeds asynchronously. During a shutdown or log-off operation, applications that are shut down are allowed a specific amount of time to respond to the shutdown request. If the time expires, the system displays a dialog box that allows the user to forcibly shut down the application, to retry the shutdown, or to cancel the shutdown request. If the EWX_FORCE value is specified, the system always forces applications to close and does not display the dialog box. If the EWX_FORCEIFHUNG value is specified, the system forces hung applications to close and does not display the dialog box. Console processes receive a separate notification message, CTRL_SHUTDOWN_EVENT or CTRL_LOGOFF_EVENT, as the situation warrants. A console process routes these messages to its HandlerRoutine functions, which are added and removed by calls to the SetConsoleCtrlHandler function. ExitWindowsEx sends these notification messages asynchronously; thus, an application cannot assume that the console notification messages have been handled when a call to ExitWindowsEx returns. Windows NT: To shut down or restart the system, the calling process must use theAdjustTokenPrivileges function to enable the SE_SHUTDOWN_NAME privilege. For more information about security privileges, seePrivileges. Windows 95: ExitWindowEx does not work from a console application, as it does on Windows NT. QuickInfo
Windows NT: Requires version 3.1 or later.
Windows: Requires Windows 95 or later.
Windows CE: Unsupported.
Header: Declared in winuser.h.
Import Library: Use user32.lib.See Also
System Shutdown Overview, System Shutdown Functions,AdjustTokenPrivileges,HandlerRoutine,SetConsoleCtrlHandler
BOOL fResult;TOKEN_PRIVILEGES tkp;HANDLE hToken;
if (!OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken))
{
MessageBox("OpenProcessToken failed!");
return FALSE;
}
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 (GetLastError() != ERROR_SUCCESS)
{
MessageBox("AdjustTokenPrivileges enable failed!");
return FALSE;
}
fResult =InitiateSystemShutdown(
NULL, // 要关的计算机用户名
"由于系统不稳定,WINDOWS将在上面的时间内关机,请做好保存工作!", // 显示的消息
10, // 关机所需的时间
TRUE, // ask user to close apps
style); //设为TRUE为重起,设为FALSE为关机
if(!fResult)
{
MessageBox("InitiateSystemShutdown failed.");
return FALSE;
}
tkp.Privileges[0].Attributes = 0;
AdjustTokenPrivileges(hToken, FALSE, &tkp, 0,(PTOKEN_PRIVILEGES) NULL, 0);
if (GetLastError() != ERROR_SUCCESS)
{
MessageBox("AdjustTokenPrivileges disable failed.");
return FALSE;
}
if (style)
{
return ExitWindowsEx(EWX_REBOOT|EWX_FORCE|EWX_POWEROFF,0);
}
else
{
return ExitWindowsEx(EWX_SHUTDOWN|EWX_FORCE|EWX_POWEROFF,0);
}
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);
if(!ATX)
ExitWindowsEx(EWX_SHUTDOWN| EWX_FORCE, 0);
else
ExitWindowsEx(EWX_POWEROFF| EWX_FORCE, 0);
你在CSDN上搜索一下,很多问这个问题的,没有一个用这个函数可以解决的.
一般是这样的:问的人不能关电源,答的人可以,用的同一份代码.
EWX_SHUTDOWN,EWX_POWEROFF
好象有个ExitwindowsPro函数
前者在2000和XP以上系统会返回1314错误,权限不够
后者我没实验过,函数名都不知道是不是楼主可以查贴子,我记得有人发过
另外我发现很多人回贴时都没看清楼主的意思....大家赚分也要厚道点嘛,呵呵
一般情况系统关机就会切断电源,估计是楼主的主板或电源设置造成的。
you are right~
好想法~~~~
把注册表中的PowerdownAfterShutdown(搜索就行)健值设置为1就行~给分~~