【发布时间】:2016-03-23 13:43:59
【问题描述】:
当我在平板电脑模式下在 Windows 10 上运行 WinForms(或 Delphi,见最后)应用程序时,当输入框获得焦点时,触摸键盘不会pop up automatically。
我相信这应该自动发生,无需任何额外的代码/设置。
为了测试,我有一个最简单的 VS 2015 WinForms 桌面应用程序,只有一个 TextBox control。
它只是由 Visual Studio 创建的默认 Windows 窗体应用程序 C# 项目。未添加代码,未更改属性。通过从 Toolbox 中删除添加了 TextBox(同样没有更改任何属性):
this.textBox1 = new System.Windows.Forms.TextBox();
this.textBox1.Location = new System.Drawing.Point(64, 27);
this.textBox1.Name = "textBox1";
this.textBox1.Size = new System.Drawing.Size(100, 20);
this.textBox1.TabIndex = 0;
验证我的假设,即弹出窗口应该是自动的:
-
我尝试在 Windows 10 上运行 Windows XP 版本的
notepad.exe。它会自动弹出触摸键盘。我怀疑 Windows XP 是否明确支持触摸键盘。 -
我也尝试过一些古老的 MFC 应用程序(例如 2005 年的 FileZilla 2.2.15)。它还会在其所有输入框中弹出触摸键盘。同样,我很确定,MFC 也没有明确支持触摸键盘。
-
对于基于 wxWidgets 构建的应用程序(例如 FileZilla 3.x)也是如此。
WinForms 中似乎有一些问题阻止了自动弹出。有趣的是,自动弹出窗口有效:
- 用于(可编辑的)组合框(
ComboBox和DropDownStyle = DropDown) - 用于密码模式下的文本框 (
TextBox.PasswordChar) - 用于富文本框 (
RichTextBox) - 当输入框有焦点时,硬件键盘被“移除”(我通过在联想 Yoga 笔记本上翻转屏幕进行测试),但之后再也没有。
我已经通过运行TabTip.exe 看到了有关显式弹出窗口的所有提示。例如:
- How to use Windows On-Screen Keyboard in C# WinForms
- Open and close Windows 8 touch keyboard tabtip under desktop
- How do I close the on-screen keyboard process from C# winform correctly?
- Keyboard Winforms on Windows 10 (surface)
大多数“解决方案”都提供这样的代码:
var progFiles = @"C:\Program Files\Common Files\Microsoft Shared\ink";
var keyboardPath = Path.Combine(progFiles, "TabTip.exe");
this.keyboardProc = Process.Start(keyboardPath);
但我不敢相信这可能是“官方”方式。如果没有别的原因,那么因为没有干净的方法来隐藏通过运行TabTip.exe 打开的键盘(解决方案包括诸如终止进程或发送 Esc 键等黑客攻击)。
实际上,上述 hack 在 Windows 10 周年更新中似乎不再适用:
有趣的是,我在 Delphi/C++ Builder/VCL 应用程序中看到了相同的行为。键盘不会弹出编辑框 (TEdit)。它确实会弹出组合框 (TComboBox) 和密码模式下的编辑框 (PasswordChar)。有趣的是,TRichEdit 不是,与 .NET RichTextBox 有什么显着差异,这可能值得研究。
这个(未回答的)问题描述了一个相同的行为:
Application written Delphi XE8 touch in edit boxes keyboard not appear in Windows 10。
【问题讨论】:
标签: c# windows winforms delphi touch