動作環境
C++ Builder XE4
RAD Studio 10.2 Tokyo Update 2 (追記: 2018/01/05)
背景
- シャットダウン機能の実装
- シャットダウンテスト開始
- OS終了
- 再起動
- IDEの立ち上げ
- SmartGitの起動
- Sublimt Textの起動
- やる気起動
この時間を短縮したい。
ShutdownBlocker
Unit1.dfm
object Form1: TForm1
Left = 0
Top = 0
BorderStyle = bsDialog
Caption = 'Shutdown Blocker'
ClientHeight = 108
ClientWidth = 645
Color = clBtnFace
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -11
Font.Name = 'Tahoma'
Font.Style = []
OldCreateOrder = False
Position = poScreenCenter
PixelsPerInch = 96
TextHeight = 13
object L_message: TLabel
Left = 32
Top = 32
Width = 78
Height = 19
Caption = 'L_message'
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -16
Font.Name = 'Tahoma'
Font.Style = []
ParentFont = False
end
end
Unit1.h
//---------------------------------------------------------------------------
#ifndef Unit1H
#define Unit1H
//---------------------------------------------------------------------------
#include <System.Classes.hpp>
#include <Vcl.Controls.hpp>
#include <Vcl.StdCtrls.hpp>
#include <Vcl.Forms.hpp>
//---------------------------------------------------------------------------
class TForm1 : public TForm
{
__published: // IDE で管理されるコンポーネント
TLabel *L_message;
private: // ユーザー宣言
public: // ユーザー宣言
void __fastcall TForm1::WMQueryEndSession(TWMQueryEndSession &WMQES);
__fastcall TForm1(TComponent* Owner);
BEGIN_MESSAGE_MAP
VCL_MESSAGE_HANDLER(WM_QUERYENDSESSION,TWMQueryEndSession,WMQueryEndSession);
END_MESSAGE_MAP(TForm)
};
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif
Unit1.cpp
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
L_message->Caption = L"";
}
//---------------------------------------------------------------------------
void __fastcall TForm1::WMQueryEndSession(TWMQueryEndSession &WMQES)
{
// 希望の処理をここに書く
L_message->Caption = L"Self-destruct sequence is deactivated.";
WMQES.Result = false; // これがあることにより、「このプログラムによりシャットダウンできません」になる
}
使用例 > スタートメニュー > シャットダウン
以下において、操作を間違うとOSがシャットダウンします
- ShutdownBlocker起動
- シャットダウしてみる
- シャットダウンがブロックされる
- ShutdownBlockerにメッセージが表示される
- 「キャンセル」を押す
使用例 > プログラムでのシャットダウン
c++ builder > shutdown処理 > XE4対応 > ログオフ
リンクのようなコードを実行したところ、ブロックされずにシャットダウンしてしまった。
if(!ExitWindowsEx( EWX_SHUTDOWN | EWX_FORCE, 0 )) {
のようにEWX_FORCEが付いている場合は「強制的にシャットダウン」と同じ処理になってしまう。
運用時を考慮するとEWX_FORCEをなくした実装はしないため、ShutdownBlocker でシャットダウン防止できない、ということが分かった。
IDE動作時は実行時引数などによりシャットダウン処理はせず、実機動作時は通常のシャットダウンを行う、というような流れになりそう。
関連
C++ Builder > シャットダウン時の処理 > WM_QUERYENDSESSION | WMQES.Result = false;「このプログラムによりシャットダウンできません」になる