如何控制輸入法的設定值

此篇在說明如何控制特定可以設定ImeMode的物件,如TextBox之類的元件控制設定值

如果是單純只是要設定英數/中文輸入法的方法非常簡單,只需要將物件的XXX,ImeMode設定為ImeMode.On或ImeMode.OnHalf,這些設定值定義可以直接在微軟的官網中找到說明文件,在此就不多做贅述。

今天要來說明的是如何改變輸入法的全/半型(全/半角)

首先的是必須了解imemode裡應傳控的控制參數值為何:

標準模式(例如智能ABC的標準模式)

輸入法狀態 mode值
中文輸入-半型-中文符號 1025
中文輸入-全型-中文符號 1033
中文輸入-半型-英文符號 1
中文輸入-全型-英文符號 9
英文輸入-半型-中文符號 1024
英文輸入-全型-中文符號 1032
英文輸入-半型-英文符號 0
英文輸入-全型-英文符號 8

另外一份則是sentence值:

模式
8
1
16
0

有了以上的兩個值,我們就能針對物件做ImeMode做指定了

        [DllImport("imm32.dll")]
        public static extern IntPtr ImmGetContext(IntPtr hwnd);

        [DllImport("imm32.dll")]
        public static extern bool ImmGetOpenStatus(IntPtr himc);

        [DllImport("imm32.dll")]
        public static extern bool ImmSetOpenStatus(IntPtr himc, bool b);

        [DllImport("imm32.dll")]
        public static extern bool ImmGetConversionStatus(IntPtr himc, ref int lpdw, ref int lpdw2);

        [DllImport("imm32.dll")]
        public static extern int ImmSimulateHotKey(IntPtr hwnd, int lngHotkey);

        public const int IME_CMODE_FULLSHAPE = 0x8;
        public const int IME_CHOTKEY_SHAPE_TOGGLE = 0x11;        
        
        /// <summary>
        /// 修改輸入法狀態
        /// </summary>
        /// <param name="h"></param>
        public static void SetInputLanguage(IntPtr h)
        {
            IntPtr HIme = ImmGetContext(h);
            ImmSetOpenStatus(HIme, true);
            if (ImmGetOpenStatus(HIme)) //如果輸入法處於打開狀態
            {
                int iMode = 1033;
                int iSentence = 0;
                //使用值參考以上列表
                bool bSuccess = ImmGetConversionStatus(HIme, ref iMode, ref iSentence); //檢索輸入法信息
                if (bSuccess)
                {
                    //if (!((iMode & IME_CMODE_FULLSHAPE) > 0)) //如果是半形
                    //    ImmSimulateHotKey(h, IME_CHOTKEY_SHAPE_TOGGLE); //轉換成全形
                }
            }
        }

就是這麼容易,再來只要在需要改變輸入法的地方直接呼叫就行了,例如:

        /// <summary>
        /// 
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        public void TextBox1_MouseDown(object sender, MouseEventArgs e)
        {
            
            TextBox oTBox = (TextBox)sender;
            SetInputLanguage((IntPtr)((Control)sender).Handle);
        }

 

參考網址:

http://www.cnblogs.com/alexander-lee/archive/2009/11/23/1608633.html