C#使用屏幕键盘填写表格
我正在创建一个winform应用程序,它需要屏幕上的windows键盘来填充文本框。我有4个文本框。我创建了4个文本框点击事件,当用户点击文本框时弹出键盘C#使用屏幕键盘填写表格,c#,winforms,visual-studio-2010,visual-studio-2012,visual-studio-2013,C#,Winforms,Visual Studio 2010,Visual Studio 2012,Visual Studio 2013,我正在创建一个winform应用程序,它需要屏幕上的windows键盘来填充文本框。我有4个文本框。我创建了4个文本框点击事件,当用户点击文本框时弹出键盘 public Form1() { InitializeComponent(); textBox1.Click += textBox1_Click; textBox2.Click += textBox2_Click; textBox3.Click += textB
public Form1()
{
InitializeComponent();
textBox1.Click += textBox1_Click;
textBox2.Click += textBox2_Click;
textBox3.Click += textBox3_Click;
textBox4.Click += textBox4_Click;
}
private void textBox1_Click(object sender, EventArgs e)
{
System.Diagnostics.Process.Start("osk");
}
private void textBox2_Click(object sender, EventArgs e)
{
System.Diagnostics.Process.Start("osk");
}
private void textBox3_Click(object sender, EventArgs e)
{
System.Diagnostics.Process.Start("osk");
}
private void textBox4_Click(object sender, EventArgs e)
{
System.Diagnostics.Process.Start("osk");
}
我面临的问题是,如果我在运行应用程序后第一次单击textbox1,键盘将只能输入textbox1。之后,如果我单击其他文本框,它将无法键入任何内容
就像我在运行应用程序后第一次单击textbox2一样,键盘将只能输入textbox2。之后,如果我单击其他文本框,它将无法键入任何内容
你们知道怎么了吗?我会这样做:
private readonly TouchKeyboardProvider touckKeyboardProvider = new TouchKeyboardProvider();
public Form1()
{
InitializeComponent();
textBox1.Click += textBox1_Click;
textBox2.Click += textBox2_Click;
textBox3.Click += textBox3_Click;
textBox4.Click += textBox4_Click;
}
private void textBox1_Click(object sender, EventArgs e)
{
touckKeyboardProvider.ShowTouchKeyboard();
}
....
将以下类添加到项目中:
class TouchKeyboardProvider
{
#region Private: Fields
private readonly string _virtualKeyboardPath;
#endregion
#region ITouchKeyboardProvider Methods
public TouchKeyboardProvider()
{
_virtualKeyboardPath = System.IO.Path.Combine(
Environment.GetFolderPath(Environment.SpecialFolder.CommonProgramFiles),
@"Microsoft Shared\ink\TabTip.exe");
if (!System.IO.File.Exists(_virtualKeyboardPath))
{
_virtualKeyboardPath = _virtualKeyboardPath.Replace(" (x86)", string.Empty);
}
}
public void ShowTouchKeyboard()
{
try
{
Process.Start(_virtualKeyboardPath);
}
catch (Exception ex)
{
// TODO: Log error.
Debug.WriteLine(ex.ToString());
}
}
public void HideTouchKeyboard()
{
var nullIntPtr = new IntPtr(0);
const uint wmSyscommand = 0x0112;
var scClose = new IntPtr(0xF060);
var keyboardWnd = FindWindow("IPTip_Main_Window", null);
if (keyboardWnd != nullIntPtr)
{
SendMessage(keyboardWnd, wmSyscommand, scClose, nullIntPtr);
}
}
#endregion
#region Private: Win32 API Methods
[DllImport("user32.dll", CharSet = CharSet.Unicode)]
private static extern IntPtr FindWindow(string sClassName, string sAppName);
[DllImport("user32.dll", EntryPoint = "SendMessage", SetLastError = true)]
private static extern IntPtr SendMessage(IntPtr hWnd, uint uMsg, IntPtr wParam, IntPtr lParam);
#endregion
}
然后更新您的表单,使其如下所示:
private readonly TouchKeyboardProvider touckKeyboardProvider = new TouchKeyboardProvider();
public Form1()
{
InitializeComponent();
textBox1.Click += textBox1_Click;
textBox2.Click += textBox2_Click;
textBox3.Click += textBox3_Click;
textBox4.Click += textBox4_Click;
}
private void textBox1_Click(object sender, EventArgs e)
{
touckKeyboardProvider.ShowTouchKeyboard();
}
....
哦,我的天,我为你感到难过。。。有一件事您不需要复制代码,一个处理程序可以做,而且您正在查找焦点事件,而不是单击。还有winforms,这是一个不太好的UI框架。当您确定可以停止osk进程时,您是否尝试过停止osk进程(按enter键、文本框失去焦点等)当单击文本框应用程序启动时,它会失去焦点。然后在单击表单应用程序上的任何文本框后,会反复启动文本框,使其失去焦点。这种情况再次发生。您是否考虑过创建自己的键盘表单,以便不必生成外部程序?