C# で IME 操作(4)

Imm 系の WindowsAPI のラッパ関数について。


IME 操作をするためには入力コンテキストハンドルが必要なのだけれども、これはウインドウハンドルさえあればいつでも取得出来るので、速度を気にしないなら最低限しか取得しないようにしたほうがいいと思う。
なので、Imm* の WindowsAPI を使用しようとした瞬間に ImmGetContext() を使って、それが終われば ImmReleaseContext() で解放するようにする。

/// <summary>
/// 入力コンテキストハンドルを取得するためのクラス
/// </summary>
class IMC : IDisposable
{
    private IntPtr hWnd;
    private int hIMC;

    #region IDisposable メンバ

    public void Dispose()
    {
        if (hWnd != IntPtr.Zero && hIMC != 0)
        {
            ImmReleaseContext(hWnd, hIMC);
        }
    }

    #endregion

    public IMC(IntPtr hWnd)
    {
        this.hWnd = hWnd;
        this.hIMC = ImmGetContext(this.hWnd);
    }

    /// <summary>
    /// 入力コンテキストハンドルの取得
    /// </summary>
    public int Handle
    {
        get { return hIMC; }
    }
}

/// <summary>
/// ImmGetCompositionString のラッパ
/// </summary>
public static int GetCompositionString(IntPtr hWnd, int dwIndex, IntPtr buf, int dwBufLe)
{
    using (IMC imc = new IMC(hWnd))
    {
        return ImmGetCompositionString(imc.Handle, dwIndex, buf, dwBufLe);
    }
}

IDisposableタソ がいるとプログラムがスマートになるんだな(*´д`*)ハァハァ