我正在为Windows8.1平板电脑开发一个应用程序(使用Java&eclipseRCP)。
我希望Windows在文本字段获得焦点时自动打开OSK,并在焦点丢失时再次关闭它。这适用于一些内置的窗口功能,如搜索(从屏幕右侧滑入并显示搜索字段)
我曾尝试以编程方式打开OSK,但它并没有按预期工作。OSK是在一个窗口中启动的,该窗口将焦点从输入字段中移除,因此,键入的字符不会到达输入。
OSK按以下启动
cmd /c c:WINDOWS/system32/osk.exe
也许还有另一种方法可以启动它,这样输入字段就不会失去焦点。
更新
我设法用以编程方式打开了键盘
Runtime.getRuntime().exec(path + "tabtip.exe")
但仅在我以管理员身份运行应用程序之后。为什么我可以从命令行运行tabtip,但不能从应用程序启动它?
命名空间Windows.ApplicationModel.Search.SearchPane有一个名为ShowOnKeyboardInput的属性。
然而,这是用于通过搜索魅力进行搜索。
这是我的解决方案,似乎可以正常工作。我曾希望Windows 8能够自动完成这项工作,但我找不到方法。
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());
}
}
});
注意
taskkill tabtip.exe
仅在Windows 8上以管理员身份运行时有效。通过cmd
启动不需要这些权限。为什么?!?:-(