采取的方式是调用com对象处理,下面是核心代码 [DllImport("imm32.dll")]
        public static extern IntPtr ImmGetContext(IntPtr hwnd);        [DllImport("User32.dll")]
        public static extern IntPtr GetKeyboardLayout(int hwnd);        [DllImport("imm32.dll")]
        public static extern int ImmGetConversionList(IntPtr hKL, IntPtr hIMC, string lpSrc, IntPtr lpDst, int dwBufLen, int uFlag);        [DllImport("imm32.dll")]
        public static extern bool ImmReleaseContext(IntPtr hwnd, IntPtr hIMC);
        const int GCL_REVERSECONVERSION = 0x0002;
        [StructLayout(LayoutKind.Sequential)]
        public class CANDIDATELIST
        {
            public int dwSize;
            public int dwStyle;
            public int dwCount;
            public int dwSelection;
            public int dwPageStart;
            public int dwPageSize;
            public int dwOffset;
        }         public string GetReverseConversion(string AText)
        {
            IntPtr AHwnd = this.Handle;
            string[] strList = null;
            IntPtr hIMC = ImmGetContext(AHwnd);
            IntPtr hKL = GetKeyboardLayout(0);
            if ((hIMC != IntPtr.Zero) && (hKL != IntPtr.Zero))
            {
                CANDIDATELIST list = new CANDIDATELIST();
                int dwSize = ImmGetConversionList(hKL, hIMC, AText, IntPtr.Zero, 0, GCL_REVERSECONVERSION);
                if (dwSize > 0)
                {
                    IntPtr BufList = Marshal.AllocHGlobal(dwSize);
                    ImmGetConversionList(hKL, hIMC, AText, BufList, dwSize, GCL_REVERSECONVERSION);
                    Marshal.PtrToStructure(BufList, list);
                    byte[] buf = new byte[dwSize];
                    Marshal.Copy(BufList, buf, 0, dwSize);
                    Marshal.FreeHGlobal(BufList);
                    int os = list.dwOffset;
                    string str = System.Text.Encoding.Default.GetString(buf, os, buf.Length - os);
                    str = Regex.Replace(str, @"\0+$", "");
                    char[] par = "\0".ToCharArray();
                    strList = str.Split(par);
                    bool returnValue = ImmReleaseContext(AHwnd, hIMC);
                }
            }
            string katakana = Microsoft.VisualBasic.Strings.StrConv(strList[0], Microsoft.VisualBasic.VbStrConv.Katakana, 0);
            return Microsoft.VisualBasic.Strings.StrConv(katakana, Microsoft.VisualBasic.VbStrConv.Narrow, 0); ;
        } 现在有个问题,假设点button后直接处理,不会出异常:string text_kana = GetReverseConversion(this.textBox1.Text);
            this.textBox2.Text = text_kana; 但是如果先弹出message后,便出现nullreference异常,MessageBox.Show("メッセージ表示");
            string text_kana = GetReverseConversion(this.textBox1.Text);
            this.textBox2.Text = text_kana; 为啥呢?