积极答复者
C#软键盘 焦点求助

问题
-
大家好,由于要做一个收银系统,是触摸屏的,操作员无法看到桌面,所以需要提供一个软键盘供其切换输入法和输入汉字、字母等,在一个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有内容输入,请教各位如何解决这个问题,非常感谢?
答案
-
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/- 已标记为答案 Leo Liu - MSFTModerator 2010年12月17日 3:14
-
一个比较简单的方法,就是重写textbox控件,将你的软键盘一起作为textbox的输入。而不是单独建立一个form。
或者使用窗体之间用委托来做一个回调函数,当完成输入的时候,将输入内容传回母窗体。
这里只是提供一个思路。
或者你就参考系统键盘的方式,用钩子去完成内容的输入。
family as water- 已标记为答案 Leo Liu - MSFTModerator 2010年12月17日 3:14
-
首先,先把需要作为软键盘的 Form 设置为 MainForm 的子控件,然后,利用 ShowWindow() API 传递 SW_DEACTIVE 开关以表示显示这个窗体时默认不获得焦点。您还需要在创建软键盘窗体时,指定它不可被活动 (Active),详细信息,请参考 CreateWindow 以及 SetWindowLong。
Mark Zhou- 已标记为答案 Leo Liu - MSFTModerator 2010年12月17日 3:14
全部回复
-
一个比较简单的方法,就是重写textbox控件,将你的软键盘一起作为textbox的输入。而不是单独建立一个form。
或者使用窗体之间用委托来做一个回调函数,当完成输入的时候,将输入内容传回母窗体。
这里只是提供一个思路。
或者你就参考系统键盘的方式,用钩子去完成内容的输入。
family as water- 已标记为答案 Leo Liu - MSFTModerator 2010年12月17日 3:14
-
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/- 已标记为答案 Leo Liu - MSFTModerator 2010年12月17日 3:14
-
首先,先把需要作为软键盘的 Form 设置为 MainForm 的子控件,然后,利用 ShowWindow() API 传递 SW_DEACTIVE 开关以表示显示这个窗体时默认不获得焦点。您还需要在创建软键盘窗体时,指定它不可被活动 (Active),详细信息,请参考 CreateWindow 以及 SetWindowLong。
Mark Zhou- 已标记为答案 Leo Liu - MSFTModerator 2010年12月17日 3:14
-
你可以参考下:http://www.jbxue.com/article/6404.html
- 已编辑 snowfly_2009 2013年3月8日 8:14