보통 윈도우를 종료하려면 아래의 API를 사용한다.
ExitWindowsEx( EWX_SHUTDOWN|EWX_FORCE, 0 );
자세한 내용은 MSDN참고.
위 API를 이용해서 종료하면, 시작버튼->종료 를 누른것과 같다. 윈도우입장에서 보면 현재 상태를 저장하고 종료한다.
하지만 윈도우의 상태를 저장할 때, 시스템이 바로 종료되지 않을 수 있기 때문에 문제가 생기는 경우가 종종있다. 예를 들면, 종료 중...상태에서 멈춰있다거나.....
그냥 윈도우를 종료하려면 NtShutdownSystem을 사용하면 된다.
아마도 ExitWindowsEx API의 마지막에서는 NtShutdownSystem를 호출하는 거 같다.
NtShutdownSystem은 윈도우의 상태를 저장하지 않고 그냥 종료해버린다. 쉽게 얘기하면 '종료 중...' 이라는 메시지가 나오지 않는다. 그냥 퍽!하고 꺼진다.
사용은 다음과 같이 하면 된다.
typedef enum _SHUTDOWN_ACTION
{
ShutdownNoReboot,
ShutdownReboot,
ShutdownPowerOff
} SHUTDOWN_ACTION;
typedef DWORD (WINAPI* lpNtShutdownSystem)(SHUTDOWN_ACTION Action);
HINSTANCE hGetProcIDDLL = LoadLibrary( _T("ntdll.dll") );
lpNtShutdownSystem NtShutdownSystem = NULL;
NtShutdownSystem = ( lpNtShutdownSystem )GetProcAddress( hGetProcIDDLL, "NtShutdownSystem" );
if( !NtShutdownSystem )
{
AfxMessageBox( _T("기능을 수행할 수 없습니다.") );
FreeLibrary( hGetProcIDDLL );
return 1;
}
NtShutdownSystem( ShutdownPowerOff );
소스를 보면 알겠지만 재부팅도 된다.
댓글 없음:
댓글 쓰기