C#使用屏幕键盘填写表格

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

我正在创建一个winform应用程序,它需要屏幕上的windows键盘来填充文本框。我有4个文本框。我创建了4个文本框点击事件,当用户点击文本框时弹出键盘

    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键、文本框失去焦点等)当单击文本框应用程序启动时,它会失去焦点。然后在单击表单应用程序上的任何文本框后,会反复启动文本框,使其失去焦点。这种情况再次发生。您是否考虑过创建自己的键盘表单,以便不必生成外部程序?