18
  • 对比 2010
  • 开发在 64 位操作系统上运行的 32 位应用程序(Windows 7、Windows 8 - 桌面应用程序)
  • C#
  • .NET 4.0
  • WinForms

我在osk.exe从应用程序启动 Windows 屏幕键盘 ( ) 时发现了许多线程,但我遇到了一些问题。这似乎是因为我在 64 位操作系统上运行 32 位应用程序。我在这里尝试了 WooCaSh 发布的代码: WinForms 中的屏幕上的键盘

但是这三种不同的路径都不适合我。对于sysnative路径,Process.Start失败并显示 “找不到指定的路径”。对于system32osk.exe路径,我收到“无法启动屏幕键盘”错误对话框。

我在这里找到了一个可能的解决方法,这比我正在寻找的要复杂一些(eryang 发布):http ://social.msdn.microsoft.com/Forums/en-US/netfx64bit/thread/10ebc62f-e6d7 -4072-9fd1-ea3784a0966f/

  1. 有没有更简单或更正确的方法来做到这一点?
  2. 我希望当用户选择文本框时,在平板电脑上运行我的应用程序会自动启动屏幕键盘,但没有运气。这是正常的还是我错过了什么?我发现在桌面模式(我的应用程序是)下,键盘不会在 Windows 8 中自动启动:http: //www.bleepingcomputer.com/forums/t/480250/keyboard-does-not-pop-up - 自动/显然它适用于 Windows 7 平板电脑,但我无法测试,因为我这里只有 Windows 8 平板电脑。
4

6 回答 6

22

我现在正在启动“触摸键盘”而不是“屏幕键盘”(无论如何,这是我在 Windows 8 上想要的键盘):

string progFiles = @"C:\Program Files\Common Files\Microsoft Shared\ink";
string keyboardPath = Path.Combine(progFiles, "TabTip.exe");

this.keyboardProc = Process.Start(keyboardPath);

这适用于我的 Win7 和 Win8,无论我在 64 位操作系统上的 32 位应用程序如何。但是,完成后我仍然遇到以编程方式关闭键盘的问题。进程 ,this.keyboardProc似乎没有得到句柄,立即拥有了属性HasExited = true。这意味着我试图关闭或杀死它失败了。

根据这个线程,如果用户手动打开键盘(或者我以编程方式启动它),当文本字段失去焦点时键盘不会自动关闭/隐藏:Windows 8 - 如何关闭触摸键盘?我尝试了将焦点设置为隐藏按钮的解决方法,但由于我自己启动了键盘,它不会自动关闭。

于 2013-03-22T17:56:58.490 回答
12

我无法关闭屏幕键盘。您可以使用以下方式启动触控键盘

string progFiles = @"C:\Program Files\Common Files\Microsoft Shared\ink";
string onScreenKeyboardPath = System.IO.Path.Combine(progFiles, "TabTip.exe");
onScreenKeyboardProc = System.Diagnostics.Process.Start(onScreenKeyboardPath);

并关闭所有键盘

//Kill all on screen keyboards
Process[] oskProcessArray = Process.GetProcessesByName("TabTip");
foreach (Process onscreenProcess in oskProcessArray)
{
    onscreenProcess.Kill();
}

由于某种原因 onScreenKeyboardProc.Kill() 或 .Close() 不起作用。

于 2013-07-31T09:09:42.920 回答
7

要使键盘自动打开,控件必须实现一些 UI 自动化控制模式,特别是 ITextProvider/IValueProvider。这很麻烦,但它可以工作(而且它比启动一些 *.exe 更干净)

我在这里写了一个示例应用程序和一篇短文:http: //blog.tombam.net/implementing-textbox-with-on-screen-touch-keyboard-part-1/

于 2017-05-10T07:27:21.283 回答
2

触摸键盘利用 UI 自动化。由于某些对我来说很神秘的原因,标准的 Windows 编辑框没有实现 UI 自动化,而其他控件(如组合框)可以实现。


可以使用来自UIAutomationClient.dll.

为了将 UI 自动化神奇地注入应用程序,UiaCoreApi必须触发程序集内部类的类初始化程序。

On 可以通过调用看似无操作来实现这一点:

AutomationElement.FromHandle(IntPtr)(-1)

另一种方法是显式实现自动化 UI。为此实现相应输入控件的ITextProvider/IValueProvider接口。

要将接口的实现绑定到控件,请使用=处理WM_GETOBJECT窗口消息lParamRootObjectId

有关实现的示例,请参见

虽然有趣的是,触摸键盘开箱即用的控件(如组合框或密码编辑框,请参阅答案)不实现WM_GETOBJECT/ RootObjectId。它们背后一定有不同的机器。


此问题最常见的“解决方案”是通过运行TabTip.exeor显式弹出键盘osk.exe,这是难以接受的。

如果没有别的,那么因为没有干净的方法来隐藏通过运行打开的键盘TabTip.exe(解决方案包括像杀死进程或发送Esc密钥这样的黑客攻击)。

实际上,上述破解似乎在 Windows 10 周年更新中不再起作用:在 Windows 10 周年版中显示触摸键盘 (TabTip.exe)

于 2017-05-25T06:50:37.887 回答
0

启动 TabTip.exe 不再适用于 Widnows 10 周年纪念版。我发现了一个未记录的用于控制触摸键盘的 COM 接口。在此处检查代码https://stackoverflow.com/a/40921638/332528

于 2016-12-01T22:45:23.090 回答
0

我在这里和其他地方冲浪然后我实现了这个:

using System.Diagnostics; // remember use this

public partial class Window1 : Window
{

    public Process _p = null;
   
    public Window1()
    {
        InitializeComponent();          
    }

    public void Button_Click(object sender, RoutedEventArgs e)
    {
        if (_p != null)
        {
            _p.Kill();
            _p.Dispose();
            _p = null;
        }
        _p = Process.Start(@"C:\Program Files\Common Files\microsoft shared\ink\TabTip.exe");    
    }

    private void Acceso_Closing(object sender, System.ComponentModel.CancelEventArgs e)
    {
        if (_p != null)
        {
            _p.Kill();
            _p.Dispose();
            _p = null;
        }
    }
}

它工作正常,所以我在这里分享它,以防你的信息对我有帮助。

于 2020-08-18T13:46:20.203 回答