Search code examples
c#windows-mobilecompact-frameworkwindows-ceime

Is there any way to change input method on .NET Compact Framework 2.0


I'm developing a Windows Mobile application in C#, .NET Compact Framework 2.0. Installed OS is Windows Mobile 6.0.

The problem is when I input some text on a Textbox using physical keyboard, Korean is typed always because OS is Korean window mobile. So, I try to change IME mode to English programmatically but there is no method in the Framework. For example

TextBox tb = new TextBox();
tb.ImeMode = ImeMode.Alpha; // CF does't support this property

Of course once I change the mode using soft keyboard on the screen, it works in English but I don't want to use one.

I want to know the method exactly same works like the code above.

Somebody help me~~


Solution

  • public partial class Form1 : Form
    {
        [DllImport("coredll.dll")]
        public static extern IntPtr ImmGetContext(IntPtr hWnd);
    
        [DllImport("coredll.dll")]
        public static extern Boolean ImmReleaseContext(IntPtr hWnd);
    
        [DllImport("coredll.dll")]
        public static extern Boolean ImmSetConversionStatus(IntPtr hIMC, Int32 fdwConversion, Int32 fdwSentence);
    
        [DllImport("coredll.dll")]
        public static extern Boolean ImmSetOpenStatus(IntPtr hIMC, Int32 fOpen);
    
        [DllImport("coredll.dll")]
        public static extern Int32 ImmAssociateContext(IntPtr hWnd, Int32 hIMC);
    
        public enum ImeMode { 
            NOCONTROL = 0,
            OFF = 1,
            ON = 2,
            DISABLE = 3,
            KOREAFULL = 4,
            KOREA = 5,
            ALPHAFULL = 6,
            ALPHA = 7
            };
    
        Int32 ALPHANUMERIC = 0x0; 
        Int32 NATIVE = 0x1;
        Int32 FULLSHAPE = 0x8;
        Int32 ROMAN = 0x10;
    
        public Form1()
        {
            InitializeComponent();
        }
    
        private void SetImeMode(Control ctrl, ImeMode mode)
        {
            IntPtr himc = ImmGetContext(ctrl.Handle);
            Int32 dwConversion = 0;
    
            try
            {
                switch (mode)
                {
                    case ImeMode.DISABLE:
                        ImmAssociateContext(himc, 0);
                        break;
                    case ImeMode.OFF:
                        ImmAssociateContext(himc, 1);
                        ImmSetOpenStatus(himc, 0);
                        break;
                    case ImeMode.ON:
                        ImmAssociateContext(himc, 1);
                        ImmSetOpenStatus(himc, 1);
                        break;
                    case ImeMode.KOREAFULL:
                        dwConversion = NATIVE | FULLSHAPE | ROMAN;
                        ImmSetConversionStatus(himc, dwConversion, 0);
                        break;
                    case ImeMode.KOREA:
                        dwConversion = NATIVE | ROMAN;
                        ImmSetConversionStatus(himc, dwConversion, 0);
                        break;
                    case ImeMode.ALPHAFULL:
                        dwConversion = FULLSHAPE | ALPHANUMERIC;
                        ImmSetConversionStatus(himc, dwConversion, 0);
                        break;
                    case ImeMode.ALPHA:
                        dwConversion = ALPHANUMERIC;
                        ImmSetConversionStatus(himc, dwConversion, 0);
                        break;
                }                
            }
            finally
            {
                ImmReleaseContext(ctrl.Handle);
            }
    
        }
    
        private void button1_Click(object sender, EventArgs e)
        {
            SetImeMode(textBox1, ImeMode.KOREA);
        }
    
    }