当我在平板电脑模式下在Windows 10上运行WinForms(或Delphi,请参见最后)应用程序时,当输入框被聚焦时,触摸键盘不会自动弹出.
我相信这应该自动发生,无需任何额外的代码/设置.
对于测试,我有一个单一TextBox
控件的最简单的VS 2015 WinForms桌面应用程序.
它只是Visual Studio创建的默认Windows窗体应用程序C#项目.没有添加代码,没有更改属性.刚刚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;
Run Code Online (Sandbox Code Playgroud)
要验证我的假设是弹出应该是自动的:
我试图notepad.exe
在Windows 10上运行Windows XP版本.它会自动弹出触摸键盘.我怀疑Windows XP对触摸键盘有任何明确的支持.
我也尝试了一些古老的MFC应用程序(例如2005年的FileZilla 2.2.15).它还会在所有输入框上弹出触摸键盘.同样,我很确定,MFC也没有明确支持触摸键盘.
对于基于wxWidgets构建的应用程序(例如FileZilla 3.x)也是如此.
看起来WinForms中有一些东西会阻止自动弹出窗口.有趣的是,自动弹出功能:
ComboBox
带DropDownStyle = DropDown
)TextBox.PasswordChar
)RichTextBox
)我已经通过运行它看到了关于显式弹出窗口的所有提示TabTip.exe
.例如:
大多数"解决方案"都提供如下代码:
var progFiles = @"C:\Program Files\Common Files\Microsoft Shared\ink"; …
Run Code Online (Sandbox Code Playgroud) 我osk.exe
从应用程序启动Windows屏幕键盘()时发现了许多线程,但我遇到了一些问题.这似乎是因为我在64位操作系统上运行32位应用程序.我已经尝试过WooCaSh发布的代码:
WinForms屏幕上的键盘
但是这三种不同的路径都不适合我.对于sysnative
路径,Process.Start
失败并显示 "无法找到指定的路径".对于system32
和osk.exe
路径,我得到"无法启动屏幕键盘"错误对话框.
我发现了一个可能的解决方法在这里,这是一个小比我一直在寻找(由eryang后)更加复杂:http://social.msdn.microsoft.com/Forums/en-US/netfx64bit/thread/10ebc62f-e6d7 -4072-9fd1-ea3784a0966f /
如何在winform和wpf中以编程方式鼠标移动,单击,右键单击和按键等.如果可能的话,请帮我编写代码片段.
I want to start the new On-Screen-Keyboard (OSK) using code. You can find this one in the taskbar:
(if not there you find it by right clicking the taskbar).
I have already tried the regular:
System.Diagnostics.Process.Start("osk.exe");
Run Code Online (Sandbox Code Playgroud)
But I want to start the other one (not in window mode). Here you see which OSK I want and which one not:
How can I start that version? And how can I start it in a certain setting (if possible)?
我需要从Windows 8(桌面winform .NET)下的程序中关闭tabtip键盘.我发现需要时打开它,运行TabTip.exe来显示Windows 8 Touch键盘,但我无法在需要时关闭它!我试图用process.kill来杀死这个过程,但是它没有用,有人知道怎么做了吗?
关心让 - 克劳德
当焦点进入 时TextField
,触摸屏键盘不会出现。
我想这是因为 JavaFx 应用程序不符合 Metro 标准?
我找到了一种弹出键盘的方法:
public class Controller {
public static void showVirtualKeyboard(
ObservableValue<? extends Boolean> observable,
Boolean oldState,
Boolean hasFocus )
{
if( hasFocus ) {
try {
Runtime.getRuntime().exec(
"cmd /c \"C:\\Program Files\\Common Files\\microsoft " +
"shared\\ink\\tabtip.exe\"" );
}
catch( final Throwable t ) {
LogHelper.severe( t );
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
在任何情况下:
final class VisualAnalysis extends GridPane implements IView {
private final TextField tech = new TextField();
@Override
public void setController( Controller ctrl …
Run Code Online (Sandbox Code Playgroud) 我希望能够支持自定义 Windows 控件中的文本输入,就像 EDIT 和 Rich Edit 控件已经做的那样,但不对其中任何一个控件进行子类化。该控件当前使用 Direct2D 和 DirectWrite 绘制文本,并在带有平台更新的 Windows Vista SP1 或更高版本上运行(如果我决定需要更新的 Direct2D 和 DirectWrite 功能,我可能会将其更改为带有平台更新的 Windows 7 SP1 或更高版本,假设这些功能是在那里可用或仅在 Windows 8 上可用,但这是一个不同的问题......)
就其价值而言,在 OS XI 上我会使用NSTextInputClient,在 GTK+ 上我会使用GtkIMContext。我正在谈论的就是这样的事情。
显而易见的选择是使用WM_CHAR
,如果我正确收集的话,如果窗口类是用 注册的RegisterClassW()
,那么它本身就是 UTF-16 ,因此无论位置如何都应该“正常工作”。然而,WM_CHAR
是由 生成的TranslateMessage()
,并且它的文档说没有办法确定 a 是否WM_CHAR
已生成,因为TranslateMessage()
总是返回非零。我需要能够确定当前的键盘消息是否将由文本系统处理(因此应该被忽略);这尤其正确,因为所有非文本键都需要以独立于布局的方式处理(我已经有了)。
我还在 Windows 7 示例代码中看到了 IMM API 和文本服务框架。我不确定一个是否比另一个更好,而且他们似乎都做同样的事情。他们吗?
就 IMM 而言,有许多WM_IMM_xxx
消息我不确定是否应该忽略,并且我发现的每个参考文献似乎都不同意我是否应该在 Unicode 窗口中处理它们。 ..此外,上述了解 IMM 是否会处理给定按键事件的问题仍然悬而未决;有办法吗?
TSF 有一个称为 ACP 的概念,它似乎允许我使用我想要的任何文本存储格式来存储我实际要使用的文本(即,不是正在进行的合成)。这是真的?我希望能够将文本存储为带有属性的 UTF-8,在绘图时转换为 …
我试图找出Windows 10虚拟触摸键盘是否可见,以确定是否从我的应用程序打开它.以下代码已经工作正常,直到最新的Windows 10更新15063或可能在它之前.好像微软改变了窗口样式的东西,但我无法弄明白.
public static bool IsKeyboardVisible()
{
IntPtr keyboardHandle = GetKeyboardWindowHandle();
// Specifies we wish to retrieve window styles.
int GWL_STYLE = -16;
//The window is disabled. See http://msdn.microsoft.com/en-gb/library/windows/desktop/ms632600(v=vs.85).aspx.
UInt32 WS_VISIBLE = 0x10000000;
UInt32 WS_DISABLED = 0x08000000;
UInt32 WS_POPUP = 0x80000000;
bool visible = false;
bool disabled = false;
if (keyboardHandle != IntPtr.Zero)
{
UInt32 style = GetWindowLong(keyboardHandle, GWL_STYLE);
visible = ((style & WS_VISIBLE) == WS_VISIBLE);
disabled = ((style & WS_DISABLED) == WS_DISABLED); // ref https://stackoverflow.com/questions/11065026/get-window-state-of-another-process
log.InfoFormat("style:{0:X4} visible:{1} disabled:{2}", …
Run Code Online (Sandbox Code Playgroud) 我通过按下按钮从我的应用程序中以管理员帐户启动触摸键盘,如下所示:
var progFiles = @"C:\Program Files\Common Files\Microsoft Shared\ink";
var keyboardPath = Path.Combine(progFiles, "TabTip.exe");
Process.Start(keyboardPath);
Run Code Online (Sandbox Code Playgroud)
但是,对于非管理员帐户,触摸键盘不会启动。
我尝试了各种技术(使用 ShellExecuteEx、CreateProcessWithLogonW、模拟等),但都没有成功。
是否有可能做到这一点?