Mam's WebSite

Mamの覚書Q&A検索


大項目:「 Delphi 」 - 中項目:「 API 」

「 IME制御 」

IME制御


回答

ソース

unit Unit1;
 
interface
 
uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs
  ,uIMEStartEnd, Vcl.StdCtrls
  ,IMM //IMEの制御のためのユニット
  ;
 
type
  TDummyEdit = class(TEdit);
  TDummyScreen=class(TScreen);
 
  TForm1 = class(TForm)
    Memo1: TMemo;
    Edit1: TEdit;
    Edit2: TEdit;
    Edit3: TEdit;
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure Edit2Exit(Sender: TObject);
    procedure Edit3Exit(Sender: TObject);
  private
    { Private 宣言 }
  public
    { Public 宣言 }
    procedure IMEStartEndEvent(const iWnd: HWND; const iStart: Boolean);
  end;
 
var
  Form1: TForm1;
 
implementation
 
{$R *.dfm}
 
procedure TForm1.Edit2Exit(Sender: TObject);
begin
  //IME が未確定文字列を生成している途中かどうかを示します。
  if TDummyEdit(Edit2).FInImeComposition then
  begin
    memo1.Lines.Add('Start');
  end;
  memo1.Lines.Add('Exit');
end;
 
procedure TForm1.Edit3Exit(Sender: TObject);
var IMC:HIMC;
begin
  IMC:=ImmGetContext(TEdit(Sender).Handle);
  try
    {
    //変換実行
    ImmNotifyIME(IMC,NI_COMPOSITIONSTR,CPS_CONVERT,0);
    //変換候補の表示
    ImmNotifyIME(IMC,NI_OPENCANDIDATE,0,0);
    }
 
    //TScreenは、FLastActiveControlという、
    //直前にフォーカスがあったコントロールを保持する変数を持っていますが
 
    //IME が未確定文字列を生成している途中かどうかを示します。
    if TDummyEdit(Sender).FInImeComposition then
    begin
      TEdit(Sender).SetFocus;
      TEdit(Sender).SelStart:=length(TEdit(Sender).Text);
 
      ImmNotifyIME(IMC,NI_COMPOSITIONSTR,CPS_COMPLETE,0);
    end;
  finally
    ImmReleaseContext(TEdit(Sender).Handle,IMC);
  end;
 
(*
BOOL ImmNotifyIME(HIMC hIMC, DWORD dwAction, DWORD dwIndex, DWORD dwValue);
 
hIMC 入力コンテキストのハンドルを指定
dwAction 通知コードを指定。次のいずれかの値を指定
  NI_CHANGECANDIDATELIST
    選択されている候補一覧を変更します。
    dwIndex パラメータには、選択する候補一覧のインデックスを指定し、
    dwValue パラメータには何も指定しません。
  NI_CLOSECANDIDATE
    IME に、候補一覧を閉じるように指示します。
    dwIndex パラメータには、閉じる一覧のインデックスを指定し、
    dwValue パラメータには何も指定しません。
    IME は、一覧を閉じたらアプリケーションに メッセージを送信します。
  NI_COMPOSITIONSTR
    IME に、変換文字列に対する処理を実行するように指示します。
    dwValue パラメータには何も指定しません。
    DwIndex パラメータには、
    CPS_CANCEL、CPS_COMPLETE、CPS_CONVERT、CPS_REVERT
    のいずれかを指定します。
  NI_IMEMENUSELECTED
    IME に、指定したメニューを処理することをアプリケーションに許可するよう
    指示します。
    dwIndex パラメータにはメニューの ID を指定し、
    dwValue パラメータにはそのメニュー項目用のアプリケーション定義の値を指定します。
  NI_OPENCANDIDATE
    IME に、候補一覧を開くように指示します。
    dwIndex パラメータには、開く一覧のインデックスを指定します。
    DwValue パラメータには、何も指定しません。
    IME は、一覧を開いたらアプリケーションに メッセージを送信します。
  NI_SELECTCANDIDATESTR
    変換候補の 1 つを選択します。
    dwIndex パラメータには、対象とする候補一覧のインデックスを指定します。
    dwValue パラメータには、その候補一覧での候補文字列のインデックスを指定します。
  NI_SETCANDIDATE_PAGESIZE
    dwIndex パラメータには、変更する候補一覧を指定します。
    0~3 の範囲内の値を指定しなければなりません。
  NI_SETCANDIDATE_PAGESTART
    dwIndex パラメータには、変更する候補一覧を指定します。
    0~3 の範囲内の値を指定しなければなりません。
dwIndex 候補一覧のインデックスを指定。
  dwAction パラメータに NI_COMPOSITIONSTR を指定した場合は、次の値を指定
  CPS_CANCEL 変換文字列を消去し、状態を変換文字列なしに設定します。
  CPS_COMPLETE 現在の変換文字列を変換結果として確定します。
  CPS_CONVERT 変換文字列を変換します。
  CPS_REVERT 現在の変換文字列を取り消し、未変換文字列に戻します。
dwValue
  dwAction パラメータに指定した値に応じて、候補文字列のインデックスを指定するか、
  または何も指定しません。
 
戻り値
  関数が成功すると、0 以外の値が返ります。
  関数が失敗すると、0 が返ります。
 
*)
 
end;
 
procedure TForm1.FormCreate(Sender: TObject);
begin
  // イベントハンドラ設定
  AddIMEEventListener(IMEStartEndEvent);
end;
 
procedure TForm1.FormDestroy(Sender: TObject);
begin
  // イベントハンドラ削除
  RemoveIMEEventListener(IMEStartEndEvent);
end;
 
procedure TForm1.IMEStartEndEvent(const iWnd: HWND; const iStart: Boolean);
begin
// iStart が True の時、IME 変換開始
// iWnd には対象の Window Handle が入っている
 
(*
  if (iStart) then
    memo1.Lines.Add('START')
  else
    memo1.Lines.Add('END');
*)
 
end;
 
end.

Copyright 2019 Mam