在C#中为Windows 8平板电脑启动键盘

时间:2013-12-23 16:03:29

标签: c# keyboard tablet windows-8.1

我正在开发Windows 8.1平板电脑的用户界面,该平板电脑上有完整版本的Windows。 Windows 8.1底部有一个键盘图标,它会弹出一个键盘,我想在单击一个numericUpDown框后自动触发。然后我还希望它在离开或点击框后关闭。

我基本上只是在点击它时试图集中它,但这似乎没有调出键盘。另外,请注意,我正在为函数中的一个设置其他numericUpDown框,以便我可以在外面调用它,所以我希望这不会让人很难看到发生了什么,如果你需要请告诉我任何澄清,谢谢你的帮助。以下是我到目前为止的情况:

copiedNUD.Click += CopiedNudPass_Focus;

//copy copied nud
CopiedNudPass = copiedNUD;

...

void CopiedNudPass_Focus(object sender, EventArgs e)
{
    CopiedNudPass.Focus();
}

我尝试了一下,但有些解决方案对我来说并不太清楚。我非常感谢你的帮助。谢谢。

3 个答案:

答案 0 :(得分:2)

我明白了。这是我的代码,专门用于8或更高窗口的平板电脑:

copiedNUD.Click += CopiedNudPass_Focus;

//copy copied nud
CopiedNudPass = copiedNUD;

...


//Launch keyboard
void CopiedNudPass_Focus(object sender, EventArgs e)
{

    Version win8version = new Version(6, 2, 9200, 0);

    if (Environment.OSVersion.Version >= win8version)
    {
        string progFiles = @"C:\Program Files\Common Files\Microsoft Shared\ink";
        string keyboardPath = Path.Combine(progFiles, "TabTip.exe");

    Process.Start(keyboardPath);
    }
}

//Close keyboard
void CopiedNudPass_LostFocus(object sender, EventArgs e)
{

    Version win8version = new Version(6, 2, 9200, 0);

    if (Environment.OSVersion.Version >= win8version)
    {
        Process[] oskProcessArray = Process.GetProcessesByName("TabTip");
        foreach (Process onscreenProcess in oskProcessArray)
        {
            onscreenProcess.Kill();
        }
    Refresh();
    }
}

我现在唯一的问题是,当键盘关闭后,我的主窗体在后台被切断,我尝试使用Refresh()刷新它; ,但这似乎不起作用:(。

答案 1 :(得分:1)

这是一个更好的结束功能:

After killing the process for TabletKeyboard(TabTip.exe) application doesn't bring back to its original size in wpf

这是我的新密码:

//Close keyboard
void CopiedNudPass_LostFocus(object sender, EventArgs e)
{
    Version win8version = new Version(6, 2, 9200, 0);

        if (Environment.OSVersion.Version >= win8version)
        {
            uint WM_SYSCOMMAND = 274;
            uint SC_CLOSE = 61536;
            IntPtr KeyboardWnd = FindWindow("IPTip_Main_Window", null);
            PostMessage(KeyboardWnd.ToInt32(), WM_SYSCOMMAND, (int)SC_CLOSE, 0);
        }
}

我还必须添加对WindowsBase的引用并向项目添加外部函数。这些步骤和其他代码都在我在这篇文章中链接的网址中。以下是为WindowsBase添加引用以使用System.Windows.Interop的方法;工作:

  1. 右键点击项目
  2. 突出显示添加,然后单击参考
  3. 确保在“装配”
  4. 下选择了“框架”
  5. 向下滚动并检入“WindowsBase”并点击“确定”
  6. 使用System.Windows.Interop添加;在代码的顶部和完成

答案 2 :(得分:0)

这对我有用(在Java& eclipse RCP中)

    text.addFocusListener(new FocusListener()
    {
        @Override
        public void focusLost(FocusEvent arg0)
        {
                LogUtil.logInfo("Closing OSK");

                try
                {
                    if(Settings.getBoolean(Settings.OSK_USETABTIP)) {
                        Runtime.getRuntime().exec("cmd /c taskkill /IM tabtip.exe");
                    } else {
                        Runtime.getRuntime().exec("cmd /c taskkill /IM osk.exe");
                    }
                }
                catch (IOException e)
                {
                    LogUtil.logError(e.toString());
                }
        }

        @Override
        public void focusGained(FocusEvent arg0)
        {
            try
            {
                String sysroot = System.getenv("SystemRoot");

                if(Settings.getBoolean(Settings.OSK_USETABTIP)) {
                    LogUtil.logInfo("Opening TabTip");
                    ProcessBuilder pb = new ProcessBuilder("C:/pathtotabtip/tabtip.exe");
                    pb.start();
                } else {
                    LogUtil.logInfo("Opening OSK");
                    ProcessBuilder pb = new ProcessBuilder(sysroot + "/system32/osk.exe");
                    pb.start();
                }
            }
            catch (Exception e)
            {
                LogUtil.logError(e.toString());
            }
        }
    });