none
C#软键盘 焦点求助 RRS feed

  • 问题

  • 大家好,由于要做一个收银系统,是触摸屏的,操作员无法看到桌面,所以需要提供一个软键盘供其切换输入法和输入汉字、字母等,在一个Project中有2个form,第一个form是主界面,有个文本框,第二个是键盘Form,里面有所有的键盘上的案件,当焦点移入Textbox时,弹出键盘界面,用户可以输入和切换输入法:

    MainForm:

        frmInput frm = null;
            private void textBox3_Enter(object sender, EventArgs e)
            {
                if (frm == null) frm = new frmInput();
                frm.Show();
            }

            private void textBox3_Leave(object sender, EventArgs e)
            {
                if (frm != null)
                {
                    frm.Dispose();
                    frm = null;
                }
            }

     

    Input Form:

           public frmInput()
            {
                this.TopMost = true;
                InitializeComponent();
            }

            protected override CreateParams CreateParams
            {
                get
                {
                    CreateParams cp = base.CreateParams;
                    cp.ExStyle = (int)0x08000000L;      //把窗体设置成WS_EX_NOACTIVATE样式            
                    return cp;
                }
            }
            private void button_Click(object sender, EventArgs e)
            {
                SendKeys.Send("A");
            }

    但是由于弹出键盘窗口后,窗口焦点一直在Input Form上,而不是主窗口,导致 SendKeys.Send("A")这个一直无法在主窗口的Textbox有内容输入,请教各位如何解决这个问题,非常感谢?

    2010年12月11日 11:20

答案

  • dear
    SendKeys必须要有焦点才行,你可以使用SendMessage

    [C#]程式幫您按按鈕(SendKey & SendMessage)
    http://klcin.tw/net/csharp-sendkey-sendmessage

    [C#中使用SendMessage]
    http://www.jb51.net/article/1291.htm

    如何利用SendMessage实现C#进程间通信?
    http://blog.csdn.net/tanliyoung/archive/2006/09/14/1222186.aspx
    秘訣無它,唯勤而已 http://www.dotblogs.com.tw/yc421206/
    2010年12月11日 14:26
  • 一个比较简单的方法,就是重写textbox控件,将你的软键盘一起作为textbox的输入。而不是单独建立一个form。

    或者使用窗体之间用委托来做一个回调函数,当完成输入的时候,将输入内容传回母窗体。

    这里只是提供一个思路。

    或者你就参考系统键盘的方式,用钩子去完成内容的输入。


    family as water
    2010年12月11日 13:57
  • 首先,先把需要作为软键盘的 Form 设置为 MainForm 的子控件,然后,利用  ShowWindow() API 传递 SW_DEACTIVE 开关以表示显示这个窗体时默认不获得焦点。您还需要在创建软键盘窗体时,指定它不可被活动 (Active),详细信息,请参考 CreateWindow 以及  SetWindowLong。

     


    Mark Zhou
    2010年12月12日 14:48

全部回复

  • 这个时候我再开一个记事本,居然input form的不获取焦点反而就正确了,真是奇的怪了,为什么相对于主窗口,input form的不获取焦点事件就是不对呢?
    2010年12月11日 11:42
  • 一个比较简单的方法,就是重写textbox控件,将你的软键盘一起作为textbox的输入。而不是单独建立一个form。

    或者使用窗体之间用委托来做一个回调函数,当完成输入的时候,将输入内容传回母窗体。

    这里只是提供一个思路。

    或者你就参考系统键盘的方式,用钩子去完成内容的输入。


    family as water
    2010年12月11日 13:57
  • dear
    SendKeys必须要有焦点才行,你可以使用SendMessage

    [C#]程式幫您按按鈕(SendKey & SendMessage)
    http://klcin.tw/net/csharp-sendkey-sendmessage

    [C#中使用SendMessage]
    http://www.jb51.net/article/1291.htm

    如何利用SendMessage实现C#进程间通信?
    http://blog.csdn.net/tanliyoung/archive/2006/09/14/1222186.aspx
    秘訣無它,唯勤而已 http://www.dotblogs.com.tw/yc421206/
    2010年12月11日 14:26
  • 首先,先把需要作为软键盘的 Form 设置为 MainForm 的子控件,然后,利用  ShowWindow() API 传递 SW_DEACTIVE 开关以表示显示这个窗体时默认不获得焦点。您还需要在创建软键盘窗体时,指定它不可被活动 (Active),详细信息,请参考 CreateWindow 以及  SetWindowLong。

     


    Mark Zhou
    2010年12月12日 14:48
  • 你可以参考下:http://www.jbxue.com/article/6404.html

    2013年3月8日 8:13