IME での日本語入力中を判定する
Windows フォームアプリケーション上で日本語入力中か否かを取得するためのオブジェクトを実装してみます。
ファンクションキーの処理を実装したけど日本語入力中には機能させたくない、などニーズがある場合に使えるかと思います。
実装概要
- IMessageFilter を実装するクラスを作ります。
- PreFilterMessage メソッドの実装を、ウィンドウメッセージに基づいて日本語入力の開始と終了を判別するようにします。
- Application.AddMessageFilter メソッドで、自身のインスタンスをアプリケーションレベルのメッセージフィルターとして登録します。
- 作成したクラスのインスタンスをアプリケーション開始時などに作成・保持しておきます。
- インスタンスの Compositing プロパティが true の場合は、日本語入力中です。
using System.Windows.Forms;
namespace ImeStatus
{
// ウィンドウメッセージを処理するために
// IMessageFilter インターフェイスを実装します。
public class ImeStatus : IMessageFilter
{
public ImeStatus()
{
// コンストラクター内で
// メッセージフィルターとして自身を登録します。
Application.AddMessageFilter(this);
}
public bool Compositing
{
get; private set;
}
// アプリケーションがウィンドウメッセージを処理する前に
// 呼び出されます。
public bool PreFilterMessage(ref Message m)
{
const int WmStartComposition = 0x10D;
const int WmEndComposition = 0x10E;
switch (m.Msg)
{
case WmStartComposition:
// 日本語入力の開始
Compositing = true;
break;
case WmEndComposition:
// 日本語入力の終了
Compositing = false;
break;
}
return false;
}
}
}