none
请问如何在Winform的空白窗口上弹出输入法对话框 RRS feed

  • 问题

  • Winform窗口上至少有一个textbox或其它可接收输入的控件时才可以弹出输入法对话框,
    问是空白窗口里可以弹出对话框吗?可以取得输入法输出的文字画到窗口上吗?

    一:我用:
    InputLanguage il=InputLanguage.CurrentInputLanguage
    取当前输入法,可是输入法的对话框没出现,
    所以没法输入文字.怎么样可以输入文字

    二:如果可以输入文字,怎么取到这些文字保存到一个string 中.然后可以DrawString 到窗体上




    2009年8月28日 8:39

答案

  • 你好!你在 Form 上放一个 TexBox 或 RichTextBox 样式做来和空白窗口一样就行了
    知识改变命运,奋斗成就人生!
    • 已标记为答案 小兽 2009年9月2日 2:18
    2009年8月28日 9:13
    版主
  • 请给我你的代码重现你的场景,以方便我们讨论。
    Best regards,
    Riquel
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.
    Welcome to the All-In-One Code Framework! If you have any feedback, please tell us.
    • 已标记为答案 小兽 2009年9月2日 2:18
    2009年9月1日 8:48
    版主

全部回复

  • 你好!你在 Form 上放一个 TexBox 或 RichTextBox 样式做来和空白窗口一样就行了
    知识改变命运,奋斗成就人生!
    • 已标记为答案 小兽 2009年9月2日 2:18
    2009年8月28日 9:13
    版主
  • 你好!
         你可以把一个RichTextBox控件平铺到窗体上,这样就能输入文件,也能显示输入法了!
    周雪峰
    2009年8月28日 14:46
    版主
  • 你好,可以使用Form或者Panel,至于使用哪个,要看你的布局,然后放一RichTextBox控件在上面!
    jon.valett@gmail.com
    2009年8月29日 14:21
    版主
  • 你好!你在 Form 上放一个 TexBox 或 RichTextBox 样式做来和空白窗口一样就行了
    知识改变命运,奋斗成就人生!
    几位大哥都让我用这个方法,可是就是不能用任何控件呀..
    2009年8月31日 0:22
  • 不能用这些控件呀.我做的是GDI程序.窗体上就全画出来的.
    2009年8月31日 0:23
  • 你好,可以使用Form或者Panel,至于使用哪个,要看你的布局,然后放一RichTextBox控件在上面!
    jon.valett@gmail.com
    现在的问题是不能用RichTextBox或TextBox之类的控件呀
    2009年8月31日 0:24
  • 不能用这些控件呀.我做的是GDI程序.窗体上就全画出来的.

    明白你的意思了,可以实现的,但是开发的工作量比较大啊!需要自己画光标,移动光标,画文字等!
    周雪峰
    2009年8月31日 6:12
    版主
  • 不能用这些控件呀.我做的是GDI程序.窗体上就全画出来的.

    明白你的意思了,可以实现的,但是开发的工作量比较大啊!需要自己画光标,移动光标,画文字等!
    周雪峰
    光标我想可以用Caret来做.移动光标可以计算输入文字的size来SetCaretPos()应该也没有问题.
    我现在是没法得到文字呀.没法输入中文呀.怎么办?希望得到你的指点
    2009年8月31日 7:11
  • 你好,

    如果输入英文的话,你可以处理Wndproc方法,去得到WM_CHAR消息以便得到字符。

    Best regards,
    Riquel
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.
    Welcome to the All-In-One Code Framework! If you have any feedback, please tell us.
    2009年8月31日 8:05
    版主
  • 你好,

    如果输入英文的话,你可以处理Wndproc方法,去得到WM_CHAR消息以便得到字符。

    Best regards,
    Riquel
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.
    Welcome to the All-In-One Code Framework! If you have any feedback, please tell us.
    英文好弄.就是中文不好弄呀..曾用WM_IME_CHAR去判断中文,可是中文输入法不能打开也输不了文字,现在最大的问题是先可以输入文字.请教.
    2009年8月31日 8:14
  • 那你使用Hotkey去弹出一个定制的Modal Form,这上面使用TextBox控件来得到要画的文字,关闭后再你需要的Form上画好了。

    还有你可以不要应用别人的帖子好吗,一般只有特殊的理由再引用(例如有不明白的时候,需要对方澄清的时)。
    Best regards,
    Riquel
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.
    Welcome to the All-In-One Code Framework! If you have any feedback, please tell us.
    2009年8月31日 9:03
    版主
  • 明白.以后不不引用了?

    如果要需求可以定制的Modal Form的话,我就不上来问了.
    2009年9月1日 1:14
  • 研究一下WM_IME_CHAR消息,应该是从这个消息中取出中文字符:
    http://msdn.microsoft.com/en-us/library/dd374132(VS.85).aspx

    Best regards,
    Riquel
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.
    Welcome to the All-In-One Code Framework! If you have any feedback, please tell us.
    2009年9月1日 3:38
    版主
  • 可是都没输入调用中文输入法输入文字,WM_IME_CHAR都没有发送上来呢..
    2009年9月1日 3:58
  • 你好,

    看下这个帖子,我们需要使用ImmAssociateContext函数把特定的输入上下文和我们的窗口联系起来:
    http://bytes.com/topic/net/answers/564476-how-enable-ime-custom-usercontrol

    using System.Runtime.InteropServices;
    
    public partial class UserControl1 : UserControl
    {
    IntPtr m_hImc;
    
    public const int WM_IME_SETCONTEXT = 0x0281;
    
    [DllImport("Imm32.dll")]
    public static extern IntPtr ImmGetContext(IntPtr hWnd);
    
    [DllImport("Imm32.dll")]
    public static extern IntPtr ImmAssociateContext(IntPtr hWnd, IntPtr
    hIMC);
    
    public UserControl1()
    {
    InitializeComponent();
    }
    
    private void UserControl1_Load(object sender, EventArgs e)
    {
    m_hImc = ImmGetContext(this.Handle);
    }
    
    protected override void WndProc(ref Message m)
    {
    base.WndProc(ref m);
    // the usercontrol will receive a WM_IME_SETCONTEXT message
    when it gets focused and loses focus respectively
    // when the usercontrol gets focused, the m.WParam is 1
    // when the usercontrol loses focus, the m.WParam is 0
    // only when the usercontrol gets focused, we need to call the
    IMM function to associate itself to the default input context
    if (m.Msg == WM_IME_SETCONTEXT && m.WParam.ToInt32() == 1)
    {
    ImmAssociateContext(this.Handle, m_hImc);
    }
    }
    }
    


    Best regards,
    Riquel
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.
    Welcome to the All-In-One Code Framework! If you have any feedback, please tell us.
    2009年9月1日 6:56
    版主
  • 非常感谢你.我就只知道用ImmAssociateContext,但就不知道WM_IME_SETCONTEXT这些东西.
    现在还有一个问题是我用它WM_IME_CHAR取得中文时有一些问题,比如我输入"我"字.打印出来是的"我."
    i不明白.请指教;
    我的代码:
                      StringBuilder str = new StringBuilder();
                        int size = ImmGetCompositionString(m_hImc, GCS_COMPSTR, null, 0);
                        size += sizeof(Char);
                        ImmGetCompositionString(m_hImc, GCS_RESULTSTR, str, size);
    或者还有别的方法取得中文?

    2009年9月1日 8:30
  • 请给我你的代码重现你的场景,以方便我们讨论。
    Best regards,
    Riquel
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.
    Welcome to the All-In-One Code Framework! If you have any feedback, please tell us.
    • 已标记为答案 小兽 2009年9月2日 2:18
    2009年9月1日 8:48
    版主
  •    StringBuilder sb = new StringBuilder();
    protected override void WndProc(ref Message m)
            {
                base.WndProc(ref m);
                switch (m.Msg)
                {          
                     case WM_IME_CHAR:
                        StringBuilder str = new StringBuilder();
                        int size = ImmGetCompositionString(m_hImc, GCS_COMPSTR, null, 0);
                        size += sizeof(Char);
                        ImmGetCompositionString(m_hImc, GCS_RESULTSTR, str, size);
                        sb.Append(str.ToString());
                        //MessageBox.Show(str.ToString());
                        intoText();
                        break;
                }
            }

            private void intoText()
            {
               Graphics g  = this.CreateGraphics();

               g.DrawString(sb.ToString(), new Font("宋体", 14, FontStyle.Regular), Brushes.Black, 5, 10);
               
            }

    2009年9月1日 9:26
  • 谢谢.问题已解决
    2009年9月2日 2:14
  • 你好,

    请给出你的解决方法,以便其他论坛成员可以共享这个好的方法。


    Best regards,
    Riquel
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.
    Welcome to the All-In-One Code Framework! If you have any feedback, please tell us.
    2009年9月2日 2:15
    版主
  • 已经整理,相关内容请到我的blog上看
    2009年9月2日 3:15