遇到了一个难题,请大家帮帮忙!
自定以了一个TextBox控件,不是继承和控件组合的,完全是画出来的,现在遇到的问题是怎么获取用户的输入呢?我目前是采用获取用户按键实现的,但是当用户输入中文的时候,根据用户的输入法不同根据键盘按键就没办法获取到用户的输入了,请问有没有什么解决的办法?
谢谢大家

解决方案 »

  1.   

    不是很了解,胡说一下输入法是不是通过剪贴板把内容加入的是的话,试下面的代码
           protected override void WndProc(ref Message m)
            {
                const int WM_PASTE = 0x0302;            switch (m.Msg)
                {
                    case WM_PASTE:
                        IDataObject iData = Clipboard.GetDataObject();//取剪贴板对象                    if (iData.GetDataPresent(DataFormats.Text)) //判断是否是Text
                        {
                            string str = (string)iData.GetData(DataFormats.Text);//取数据
                        }
                        else
                            m.Result = IntPtr.Zero; //不可以粘贴
                        break;
                    default:
                        base.WndProc(ref m);
                        break;
                }        }
      

  2.   

    我试了一下,好像输入法的输入可以用WM_CHAR = 0x0102 来得到只是数量好像多了些
    用不到剪贴板
      

  3.   

    大概试了一下,好像可以
    大致也就是重写WndProc得到 信息进行处理,因为.net是unicode的所有的为双字节,所以我第一次不处理第二次处理        Hashtable ip = new Hashtable();        protected override void WndProc(ref Message m)
            {
                const int WM_CHAR = 0x0102;
                const int WM_IME_CHAR = 0x286;            switch (m.Msg)
                {
                    case WM_CHAR :
                        if (m.LParam.ToInt32() == 1)     // 是输入法的输入
                        {
                            if (ip[m.WParam.ToInt32()] == null)
                            {                          
                                ip.Add(m.WParam.ToInt32(), m.WParam.ToInt32());
                                return;
                            }
                            else
                            {
                                ip.Remove(m.WParam.ToInt32());
                                base.WndProc(ref m);
                            }                        
                        }
                        else             // 普通输入
                            base.WndProc(ref m);
                        return;
                    case WM_IME_CHAR:
                        base.WndProc(ref m);
                        return;                default:
                        base.WndProc(ref m);
                        break;
                }
            }
      

  4.   

    非常感谢,我试试!
    还有一个问题,因为我的控件是画出来的,当获取焦点后录入的时候没有TextBox一样出现输入法的输入提示框(也就是输入的时候输入法的选字的提示框)没有显示出来,这有没有什么处理方法?
      

  5.   

    那你把得到的m.WParam里的内容转为char画到控件上啊!
      

  6.   

    全部是API 函数 的话,.NET 也没用了