2014-11-06 5 views
1

내 앱을 종료하는 데 시간이 얼마나 오래 걸릴 수 있습니까? example을 찾았지만 Delphi 용입니다. C++로 변환 할 수 없습니다. 여기Windows 종료 일시 중지

+0

당신이 C++ 무엇을 의미합니까? WinAPI를 사용하여 건물에 창문이 있습니까? – Ajay

+0

@Ajay : C++ Builder는 Embarcadero (이전 Borland) C++ 컴파일러/IDE입니다. 구글 그것. –

+0

@KenWhite, 나는 그것을 묻지 않았다. 만약 그들이 WM_QUERYENDSESSION을 처리 할 수 ​​있도록 OP의 프로그램에 메시지 루프가 있다는 것을 의미했습니다. – Ajay

답변

4

는 델파이 코드의 C++ 빌더 VCL 번역입니다 :

class TForm1 : public TForm 
{ 
    .. 
protected: 
    void __fastcall WMQueryEndSession(TWMQueryEndSession &Message); 
    .. 
public: 
    .. 
    BEGIN_MESSAGE_MAP 
     VCL_MESSAGE_HANDLER(WM_QUERYENDSESSION, TWMQueryEndSession, WMQueryEndSession) 
    END_MESSAGE_MAP(TForm) 
}; 

... 

void __fastcall TForm1::WMQueryEndSession(TWMQueryEndSession &Message) 
{ 
    Message.Result = TRUE; 
    if ((Message.Unused & ENDSESSION_CRITICAL) == 0) 
    { 
     ShutdownBlockReasonCreate(Handle, L"please wait while muting..."); 

     Sleep(45000); // do your work here 

     ShutdownBlockReasonDestroy(Handle); 
    } 
} 
+0

무엇이 Message.Unused & ENDSESSION_CRITICAL을위한 것인가? 어디서나 문서를 찾을 수 없었습니다. 매우 고마워요. – kizeloo

+0

'Unused' 필드는 ['WM_QUERYENDSESSION']의'lParam' 값에 해당합니다 (https://msdn.microsoft .com/en-us/library/windows/desktop/aa376890.aspx) 메시지입니다.이 필드는 VCL에 의해 * 사용되지 않습니다 *하지만 실제로 종료가 발생하는 이유를 설명하는 플래그를 포함합니다. 여기서 'ENDSESSION_CRITICAL'은 "* 응용 프로그램이 강제 종료됩니다 * ". 따라서 응용 프로그램이 OS에 의해 강제 종료되지 않는 경우 코드가 종료됩니다. –

+0

[Windows Vista의 응용 프로그램 종료 변경 사항] (https://msdn.microsoft.com)을 참조하십시오. /en-us/library/ms700677.aspx), 왜'ENDSESSION _CRITICAL'이 (가) 존재합니다. Vista에서 새 종료 API의 일부로 추가되었습니다. –

관련 문제