如何使用Windows屏幕键盘在C#中的WinForms(How to use Windows On

2019-07-22 10:41发布

  • VS 2010
  • 开发在64位操作系统上运行32位应用程序(Windows 7中,视窗8 - 桌面应用程序)
  • C#
  • .NET 4.0
  • 的WinForms

我发现在启动Windows的屏幕键盘(多线程osk.exe从应用程序),但我遇到了一些问题。 这似乎是因为我在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的平板电脑在这里。

Answer 1:

我现在发动“触感键盘”,而不是在“屏幕键盘”(这是我在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的,不管我的32位应用程序在64位操作系统。 不过,我仍然有编程关闭键盘时,我做了这个问题。 这个过程中, this.keyboardProc ,似乎并没有得到处理,并立即拥有财产HasExited = true 。 这意味着我将尝试关闭或杀死它失败。

根据这一线索,如果用户手动打开键盘(或以编程方式启动它),键盘不会自动关闭/隐藏在文本字段失去焦点: Windows 8的-如何辞退触感键盘? 我想重点设置为隐藏式按键的解决办法,但自从我推出了自己的键盘,它不会自动关闭。



Answer 2:

我有麻烦屏幕键盘上关闭。 你可以开始与触控键盘

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()不工作。



Answer 3:

对于键盘自动打开了,这些控件来实现一些UI自动化控制模式,具体ITextProvider / IValueProvider。 这是一个麻烦事,但它的工作原理(这是不是启动一些的* .exe一个更清洁的方式)

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



Answer 4:

触摸键盘充分利用了UI自动化。 对于一些原因是个谜对我来说,标准的Windows编辑框没有实现UI自动化,而其他控件,如组合框,做的。


人们可以使用实现UI自动化从UIAutomationClient.dll

对于UI自动化神奇地注入到一个应用程序,组件内部类的类初始化UiaCoreApi必须被触发。

在可以通过调用看似无操作实现这一目标,例如:

AutomationElement.FromHandle(IntPtr)(-1)

另一种方式是明确实现自动化UI。 适用于实现了ITextProvider / IValueProvider用于相应的输入控制接口。

绑定接口控制的实施,处理WM_GETOBJECT窗口消息与lParam = RootObjectId

对于实现的示例,请参阅

  • tombam的回答这个问题;
  • 或者直接海报的文章中实现文本框与屏幕上的触摸键盘 。

但有趣的是,控制,为此,触摸式键盘工作外的开箱(如组合框或密码编辑框,一看便知),不执行WM_GETOBJECT / RootObjectId 。 必须有他们背后不同的机器。


最常见的“解决方案”这个问题,要通过运行明确弹出键盘TabTip.exeosk.exe ,是难以接受的。

如果不出意外的话,因为有隐藏运行打开键盘没有干净的方式TabTip.exe (解决方案包括像杀死进程或发送Esc键黑客)。

而实际上上述黑客似乎并没有在Windows 10周年更新工作了: 显示在Windows 10周年纪念版的触摸键盘(TabTip.exe) 。



Answer 5:

开始TabTip.exe不再WIDNOWS 10周年纪念版的作品。 我发现了一个未公开的COM接口用于控制触摸键盘。 这里检查代码https://stackoverflow.com/a/40921638/332528



文章来源: How to use Windows On-Screen Keyboard in C# WinForms