2009-10-06 8 views
4

Windows XP가 종료 될 때 - 어떤 프로그램이 종료하지 않도록 요청하는지 알려주지 않습니다. 이로 인해 Windows는 계속 실행되며 어떤 프로그램이 종료를 방지하는지 알려주지 않습니다.어떤 응용 프로그램이 종료를 막고 있는지 확인하십시오.

제가 이해하는대로 Windows는 모든 응용 프로그램에 WM_QUERYENDSESSION을 보냅니다. 응용 프로그램 중 하나가 함수에 0을 반환하면 종료가 중지됩니다.

나는 프로그램에서 반환 값을 캡처하고 Windows XP가 종료되지 않는 이유를 확인하는 방법이 있는지 궁금합니다.

감사 필

+0

닭고기 및 달걀 문제. 프로세스가 종료를 방해하고 있는지 알아 내려고 시도하는 프로그램 자체가 종료를 방지합니다. –

답변

3

열거 모든 최상위 창 (사용 EnumWindows())와 각 WM_QUERYENDSESSION를 보냅니다. 예방 값을 반환하는 창은 어떤 프로세스인지 감지합니다. 후자의 GetWindowThreadProcessId() 호출을 수행하려면 모든 프로세스를 열거하고 해당 ID로 프로세스를 찾으십시오.

1

예. 나는 this question 코드를 게시하지만,이 코드의 개선 된 버전입니다 : 열거 그것의 제어에 대한 액세스 권한을 얻을 수 있도록

void CQes_testDlg::OnBtnTest() 
{ 
    // enumerate all the top-level windows. 
    m_ctrl_ListMsgs.ResetContent(); 
    EnumWindows (EnumProc, 0); 
} 

BOOL CALLBACK EnumProc (HWND hTarget, LPARAM lParam) 
{ 
    CString csTitle; 
    CString csMsg; 
    CWnd * pWnd = CWnd::FromHandle (hTarget); 
    BOOL bRetVal = TRUE; 
    DWORD dwPID; 

    if (pWnd) 
     pWnd->GetWindowText (csTitle); 
    else 
     csTitle = TEXT("<unknown>"); 

    GetWindowThreadProcessId (hTarget, &dwPID); 

    if (pWnd->SendMessage (WM_QUERYENDSESSION, 0, ENDSESSION_LOGOFF)) 
    { 
     csMsg.Format ("window 0x%X (PID=%d, Title='%s') returned TRUE", 
        hTarget, dwPID, csTitle); 
    } 
    else 
    { 
     csMsg.Format ("window 0x%X (PID=%d, Title='%s') returned FALSE *******", 
        hTarget, dwPID, csTitle); 
     bRetVal = FALSE; 
    } 

    mg_pThis->m_ctrl_ListMsgs.AddString (csMsg); 
    return bRetVal; 
} 

mg_pThis이 대화 개체에 대한 모듈 글로벌 포인터이다.

+0

모든 'WM_QUERYENDSESSION'은 반드시'WM_ENDSESSION'을 따라야합니다 (이 경우 "세션이 끝나지 않았습니다"라고 말함). –

관련 문제