2025年5月 3日(土) 23:57 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;
でも、この方法だと取り除きたいマウスとキーボードのメッセージの数だけ記述しないとダメなので、実用性はいかがなものだろうか?
別案として、別スレッドで処理するかマウスとキーボードの処理を別ウィンドウに処理させてしまう方法がある。