Windows에서 내 응용 프로그램이 종료되지 않도록하려고합니다. 응용 프로그램이 Windows 8에서 실행 중이고 XE6로 작성되었습니다. 다음 코드를 시도했지만 완전히 무시 된 것 같습니다. 테스트하기 위해 작업 관리자를 통해 단순히 "끝 작업"을 보냅니다. 내가 필요로하는 것은 내 응용 프로그램이 Windows 셧다운의 작업 관리자가 응용 프로그램을 닫을 때 수행 한 작업을 마치게하는 방법입니다. 정상 닫기는 문제가 아니며 FormCloseQuery 이벤트에 의해 처리됩니다. 그러나 내가 일할 수없는 다른 두 가지 방법. Windows XP가 시작될 때까지는 wm_endsession과 wm_queryendsession을 잡아내는 것이 쉬워 질 때까지는 Vista에서 시작하여 ShutDownBlockReasonCreate를 사용해야합니다. 그러면 ShutDownBlockReasonCreate가 true를 반환하지만 어쨌든 작동하지는 않습니다.Delphi가 응용 프로그램 종료를 막습니다.
procedure WMQueryEndSession(var Msg : TWMQueryEndSession); message WM_QUERYENDSESSION;
procedure WMEndSession(var Msg: TWMEndSession); message WM_ENDSESSION;
function ShutdownBlockReasonCreate(hWnd: HWND; Reason: LPCWSTR): Bool; stdcall; external user32;
function ShutdownBlockReasonDestroy(hWnd: HWND): Bool; stdcall; external user32;
procedure TForm1.WMEndSession(var Msg: TWMEndSession);
begin
inherited;
Msg.Result := lresult(False);
ShutdownBlockReasonCreate(Handle, 'please wait while muting...');
Sleep(45000); // do your work here
ShutdownBlockReasonDestroy(Handle);
end;
procedure TForm1.WMQueryEndSession(var Msg: TWMQueryEndSession);
begin
inherited;
Msg.Result := lresult(False);
ShutdownBlockReasonCreate(Handle, 'please wait while muting...');
Sleep(45000); // do your work here
ShutdownBlockReasonDestroy(Handle);
end;
업데이트
true로 메시지 결과를 변경하고 잠을 제거하는 것은 아무 것도 변경되지 않습니다.
procedure TForm1.WMEndSession(var Msg: TWMEndSession);
begin
inherited;
Msg.Result := lresult(True);
ShutdownBlockReasonDestroy(Application.MainForm.Handle);
ShutdownBlockReasonCreate(Application.MainForm.Handle, 'please wait while muting...');
end;
procedure TForm1.WMQueryEndSession(var Msg: TWMQueryEndSession);
begin
inherited;
Msg.Result := lresult(True);
ShutdownBlockReasonDestroy(Application.MainForm.Handle);
ShutdownBlockReasonCreate(Application.MainForm.Handle, 'please wait while muting...');
end;
[Windows 일시 중지 방법] (http://stackoverflow.com/a/18347424/576719)을 참조하십시오. –
기능이 "사기성"이라고 말할 수는 없습니다. 'ShutDownBlockReasonCreate'의 반환 값을 확인하고, false를 반환하면'GetLastError'를 사용하여 실패한 이유를 찾습니다. 왜 반환 값을 확인하지 않아도 API가 작동하지 않는다고 말할 수는 없습니다. –
버튼에서 호출하면이 함수가 true를 반환합니다. 그 값을 확인하기 전에 응용 프로그램이 종료되기 때문에 WMQueryEndSession에서 결과를 확인할 수 없습니다. – GuidoG