読者です 読者をやめる 読者になる 読者になる

いろいろ備忘録日記

主に .NET と Python絡みのメモを公開しています。

IMEの変換ウィンドウを表示しないようにする。(WndProc, WM_IME_NOTIFY, IMN_OPENCANDIDATE)


実務で開発をやっていると、たま〜にIMEの変換ウィンドウを表示しないで欲しいとかいう事もあったりします。
そこで、無理やり変換ウィンドウを表示しないようにするわけですが、その場合は以下のウィンドウメッセージを
捕らえます。

メッセージがWM_IME_NOTIFYで、且つ、WParamの値がIMN_OPENCANDIDATE


C#の場合は定数としてメッセージの値を定義するので以下の値となります。

WM_IME_NOTIFY     = 0x0282;
IMN_OPENCANDICATE = new IntPtr(5);


以下サンプルです。

// vim:set ts=4 sw=4 et ws is nowrap ft=cs:
using System;
using System.Windows.Forms;

namespace Gsf.Demo{

    public class DemoForm : Form{

        public DemoForm(){
            InitializeComponent();
        }

        protected void InitializeComponent(){

            SuspendLayout();

            Controls.Add(new ImeWindowNotOpenTextBox());

            ResumeLayout();
        }

        [STAThread]
        static void Main(){
            Application.EnableVisualStyles();
            Application.Run(new DemoForm());
        }
    }

    class ImeWindowNotOpenTextBox : TextBox{
        const    int    WM_IME_NOTIFY     = 0x0282;
        readonly IntPtr IMN_OPENCANDICATE = new IntPtr(5);

        protected override void WndProc(ref Message m){
            //
            // IMEの変換ウィンドウを開かないようにする。
            //
            if(m.Msg == WM_IME_NOTIFY && m.WParam == IMN_OPENCANDICATE){
                return;
            }

            base.WndProc(ref m);
        }
    }
}

上記のサンプルを実行するとテキストボックスが一つあります。
そのテキストボックスにて日本語を打ち込み、変換しようとしてスペースを
押下しても変換ウィンドウは表示されません。