none
かな入力モードの取得方法 RRS feed

  • 質問

  • 環境:
     OS … Windows10
     言語 … C#.NET
     .NET Framework … ver.4.5.2
     アプリ … Windows Forms

    お世話になっております。
    かなり初歩的な内容かもしれませんが、自分なりに調べても分からなかったのでご質問させてください。

    Windowsでは、アルファベット入力とかな入力のどちらかが選択できると思います。
    現在のクライアントの設定が「かな入力モードである状態か否か」を検出したいのですが、良い方法が見付かりません。

    私の環境では、Alt+カタカナひらがなローマ字キー(http://wa3.i-3-i.info/word13922.html)を押下、
    またはIMEから「かな入力」を選択することで、かな入力モードに切り替えることが出来ます。

    クライアントのプログラムは、
     ①起動する
     ②現在の入力モードがアルファベット入力かかな入力のどちらであるかを取得
     ③かな入力であればステータスバーにかな入力であることを表示
    という動きにしたいと考えています。

    「Alt+カナカナひらがなローマ字キーが押下されたか」を取得するのであれば、
    KeyUpイベントなどでKeyValueを参照すれば解決しますが、
    私が今回やりたいのは、「現在設定されている入力モードの取得」です。
    ですが、プロパティ等検索しても見付かりません。

    ご存知の方がいらっしゃいましたらご教示いただけますと幸甚です。

    2017年12月27日 8:40

回答

  • IME の入力モードの取得は ImmGetConversionStatus API を使うとできるようです。簡易的なプログラムですが、下記のようなコードで textBox1 の入力モードが分かります。

    using System;
    using System.Runtime.InteropServices;
    using System.Windows.Forms;
    
    namespace WindowsFormsApplication1
    {
        public partial class Form1 : Form
        {
            private const int IME_CMODE_ALPHANUMERIC = 0x0;
            private const int IME_CMODE_NATIVE = 0x1;
            private const int IME_CMODE_JAPANESE = IME_CMODE_NATIVE;
            private const int IME_CMODE_KATAKANA = 0x2;
            private const int IME_CMODE_LANGUAGE = 0x3;
            private const int IME_CMODE_FULLSHAPE = 0x8;
            private const int IME_CMODE_ROMAN = 0x10;
    
            [DllImport("imm32.dll", SetLastError = true)]
            private static extern IntPtr ImmGetContext(IntPtr hWnd);
            [DllImport("imm32.dll", SetLastError = true)]
            private static extern bool ImmReleaseContext(IntPtr hWnd, IntPtr hIMC);
            [DllImport("imm32.dll", SetLastError = true)]
            private static extern bool ImmGetConversionStatus(IntPtr hIMC, ref int fdwConversion, ref int fdwSentence);
    
            public Form1()
            {
                InitializeComponent();
            }
    
            private void button1_Click(object sender, EventArgs e)
            {
                IntPtr hImc = ImmGetContext(textBox1.Handle);
                int dwConv = 0;
                int dwSent = 0;
                ImmGetConversionStatus(hImc, ref dwConv, ref dwSent);
                if ((dwConv & IME_CMODE_JAPANESE) != 0)
                {
                    if ((dwConv & IME_CMODE_KATAKANA) != 0)
                    {
                        System.Diagnostics.Debug.WriteLine("カタカナ");
                    }
                    else
                    {
                        System.Diagnostics.Debug.WriteLine("ひらがな");
                    }
                }
                else
                {
                    System.Diagnostics.Debug.WriteLine("半角英数");
                }
                ImmReleaseContext(textBox1.Handle, hImc);
            }
        }
    }


    追伸: 「ローマ字入力」か「かな入力」かの判定は、dwConv に IME_CMODE_ROMAN フラグが付いているかどうかで判定できます。

    2017年12月27日 9:13

すべての返信

  • IME の入力モードの取得は ImmGetConversionStatus API を使うとできるようです。簡易的なプログラムですが、下記のようなコードで textBox1 の入力モードが分かります。

    using System;
    using System.Runtime.InteropServices;
    using System.Windows.Forms;
    
    namespace WindowsFormsApplication1
    {
        public partial class Form1 : Form
        {
            private const int IME_CMODE_ALPHANUMERIC = 0x0;
            private const int IME_CMODE_NATIVE = 0x1;
            private const int IME_CMODE_JAPANESE = IME_CMODE_NATIVE;
            private const int IME_CMODE_KATAKANA = 0x2;
            private const int IME_CMODE_LANGUAGE = 0x3;
            private const int IME_CMODE_FULLSHAPE = 0x8;
            private const int IME_CMODE_ROMAN = 0x10;
    
            [DllImport("imm32.dll", SetLastError = true)]
            private static extern IntPtr ImmGetContext(IntPtr hWnd);
            [DllImport("imm32.dll", SetLastError = true)]
            private static extern bool ImmReleaseContext(IntPtr hWnd, IntPtr hIMC);
            [DllImport("imm32.dll", SetLastError = true)]
            private static extern bool ImmGetConversionStatus(IntPtr hIMC, ref int fdwConversion, ref int fdwSentence);
    
            public Form1()
            {
                InitializeComponent();
            }
    
            private void button1_Click(object sender, EventArgs e)
            {
                IntPtr hImc = ImmGetContext(textBox1.Handle);
                int dwConv = 0;
                int dwSent = 0;
                ImmGetConversionStatus(hImc, ref dwConv, ref dwSent);
                if ((dwConv & IME_CMODE_JAPANESE) != 0)
                {
                    if ((dwConv & IME_CMODE_KATAKANA) != 0)
                    {
                        System.Diagnostics.Debug.WriteLine("カタカナ");
                    }
                    else
                    {
                        System.Diagnostics.Debug.WriteLine("ひらがな");
                    }
                }
                else
                {
                    System.Diagnostics.Debug.WriteLine("半角英数");
                }
                ImmReleaseContext(textBox1.Handle, hImc);
            }
        }
    }


    追伸: 「ローマ字入力」か「かな入力」かの判定は、dwConv に IME_CMODE_ROMAN フラグが付いているかどうかで判定できます。

    2017年12月27日 9:13
  • kenjinoteさん

    迅速にご返信いただき誠にありがとうございます!

    ご教授いただいたとおり、ImmGetConversionStatus APIを用いて、
    dwConv のIME_CMODE_ROMAN フラグを調べることで解決しました。
    助かりました。。。

    ソースコードまで付けていただき、大変参考になりました。
    ありがとうございます。

    またフォーラムに投稿させていただくと思いますが、その際はよろしくお願いいたします。

    2017年12月28日 10:03