2025年11月 5日(水) 17:50 JST
まず Norton GoBack を知らない人のためにどういうものかを説明すると
Windows が起動しないというトラブルや、重要ファイルの上書き、動作不良、ウィルス感染によるデータの消失などで取り返しのつかない状況に陥ったときに、システムを正常だった時点にまで戻したり、消失したファイルを簡単に復元できるデータリカバリーソフトだ。
インストール直後から自動バックアップを開始し、常時 HDD 内のファイルを監視する。トラブルが発生したら、リストを使って任意の時点にまでシステムを簡単に戻すことができる。戻し方も、ディスク全体を一気に戻すやり方と、過去の HDD の内容を参照しながらファイル単位で復帰させる方法が有るらしい。(くろねこはいつも全部戻してました。)PCが起動しないという場合でも、起動ディスクに自動で作成された「GoBack ドライブ」にアクセスしてデータを復旧できるというのがうたい文句だ。(こんな時、くろねこはいつも Ghost でした。)
ふつうのバックアップソフトである Norton Ghost や Symantec System Recovery とはまた違う特徴を持っていて、互いに足りない部分を保管するように作ってある。
新年あけまして、おめでとうございます。
新年と言うことで何か新しい試みをと思い、タイトルを新たにしブログなるぺージを作ってしまいました。
ここには、くろねこが日々思った疑問などを書き連ねていきたいと思います。日々疑問に思うことなのであまりサイトの内容とは無関係な内容が多くなるかと思いますが、何か同意できることや意見などがありましたら反応頂けるとうれしく思います。
WM_IME_COMPOSITION メッセージが発生したときに、ImmGetCompositionString 関数を使ってFEP (IME など) が持つフリガナを取得します。
この例は、フリガナ機能付きコンポーネントの作成例です。
TEdit コンポーネントに KanaOut プロパティを追加しています。 この追加したプロパティに、Edit1(TEdit クラス) を設定すると、入力した文字のフリガナが Edit1.Text に入力されていきます。
unit KanaEdit;
interface
uses
Windows, Messages, Classes, Graphics, Controls, StdCtrls;
type
{ TKanaEdit }
TKanaEdit = class(TEdit)
private
FKanaOut: TEdit; // KanaOutプロパティ
protected
procedure SetKanaOut(AValue:TEdit);
procedure WndProc(var Msg: TMessage); override;
published
// プロパティ
...
property KanaOut: TEdit read FKanaOut write SetKanaOut;
...
end;
procedure Register;
implementation
uses
IMM;
procedure Register;
begin
RegisterComponents('Samples', [TKanaEdit]);
end;
{*******************************************************************************
機能: カナ出力プロパティーセット
引数:
戻値:
*******************************************************************************}
procedure TKanaEdit.SetKanaOut(AValue: TEdit);
begin
if (AValue = nil) or (AValue = Self) then
begin
FKanaOut := nil;
end
else
begin
FKanaOut := AValue;
end;
end;
{*******************************************************************************
機能: メッセージ処理
引数:
戻値:
*******************************************************************************}
procedure TKanaEdit.WndProc(var Msg: TMessage);
var
imc: HIMC; // IMEのコンテキストを格納
sbKana: StringBuilder;
nSize: Integer;
begin
if (FKanaOut <> nil) then
begin
if (Msg.Msg = WM_IME_ENDCOMPOSITION) then
begin
imc := ImmGetContext(Handle);
case Msg.Msg of
WM_IME_ENDCOMPOSITION:
begin
// 変換結果の「読み」を取得
nSize := ImmGetCompositionString(imc, GCS_RESULTREADSTR, nil, 0);
sbKana := StringBuilder.Create;
sbKana.Length := nSize;
ImmGetCompositionString(imc, GCS_RESULTREADSTR, sbKana, nSize+1);
ImmReleaseContext(Handle, imc);
// 更新後文字列作成
FKanaOut.Text := FKanaOut.Text + sbKana.ToString;
end; // WM_IME_ENDCOMPOSITION
end; // case
end; // if
end; // if
inherited;
end;
end.
ある特定の処理実行中は、フォームやボタンの Enabled プロパティを False に設定し、2度同じ処理を実行されないようにしたりします。 しかし、Enabled が False でも True に変更する前にユーザがマウスクリックまたはEnterキーなどで処理をしていた場合、その操作に関連する処理は行われてしまいます。 今回はそのような問題への対策です。
以下の関数をボタンの Enabled を True にする際になどに実行します。
procedure PurgeMsgQueue(AHandle: HWND); var Msg: TMsg; begin // マウスのメッセージをキューから除去 while PeekMessage(Msg, AHandle, WM_CLOSE, WM_QUIT, PM_NOREMOVE) do exit; while PeekMessage(Msg, AHandle, WM_DESTROY, WM_DESTROY, PM_NOREMOVE) do exit; while PeekMessage(Msg, AHandle, WM_MOUSEFIRST, WM_MOUSELAST, PM_REMOVE) do; // そのほかのメッセージをキューから除去 while PeekMessage(Msg, AHandle, WM_CLOSE, WM_QUIT, PM_NOREMOVE) do exit; while PeekMessage(Msg, AHandle, WM_DESTROY, WM_DESTROY, PM_NOREMOVE) do exit; while PeekMessage(Msg, AHandle, WM_KEYDOWN, WM_KEYDOWN, PM_REMOVE) do; end;
でも、この方法だと取り除きたいマウスとキーボードのメッセージの数だけ記述しないとダメなので、実用性はいかがなものだろうか?
別案として、別スレッドで処理するかマウスとキーボードの処理を別ウィンドウに処理させてしまう方法がある。