Java - 调用屏幕键盘

4

我正在开发的应用程序将在Windows 7上运行。它将用于通过触摸屏输入一些信息。每当用户需要输入信息时,我需要弹出一个屏幕键盘。我的问题是,我应该从头开始创建一个键盘类还是使用Windows 7内置的屏幕键盘,并且如何在我的Java应用程序中调用它?谢谢。

2个回答

10

我刚刚尝试了屏幕键盘并发现它很容易使用。您只需要使用Runtime.exec()ProcessBuilder调用它。然后,如果您的应用程序失去焦点,则将其带回到应用程序中,同时活动元素必须是当前可编辑元素(文本字段、文本区域等)。此时,用户在虚拟键盘上输入字符将被写入您的应用程序。

编辑

从Java中执行osk.exe存在一些困难,它会抛出IOException: java.io.IOException: Cannot run program "C:\Windows\System32\osk.exe": CreateProcess error=740, The requested operation requires elevation

技巧在于通过命令行shell (cmd)来运行命令:

Runtime.getRuntime().exec("cmd /c C:\\Windows\\System32\\osk.exe");

这行代码在我的机器上可以正常运行。


Alex,我还有一个问题。当我实现以下代码: String sysroot = System.getenv("SystemRoot") + "/system32"; Process proc = Runtime.getRuntime().exec(sysroot + "/osk.exe"); 我收到了一个错误消息,说“无法启动屏幕键盘”。您知道为什么会出现这种情况吗? - jadrijan
另外,如果我使用notepad.exe而不是osk.exe,notepad可以正常运行。也许这与权限有关? - jadrijan
@jadrijan,抱歉耽搁了。你是对的,但我找到了诀窍。使用前缀“cmd /c”运行命令行。请查看我的编辑答案。 - AlexR
@AlexR 我使用了你的 cmd /c 技巧在 win8 下让 osk 工作。有没有可能再关闭它呢?在其他窗口中,我直接使用 osk(而不是通过 cmd /c),因此可以轻松地销毁该进程。但是,这个技巧不再起作用了。 :( - brimborium
我想这样做的原因是:当有人点击文本字段时,我希望虚拟键盘出现,当再次点击它时,我希望它再次消失(也在元素失去焦点时)。也许有其他实现方法吗? - brimborium

3
我刚刚遇到了同样的问题,另外我正在64位Win7上运行32位应用程序(实际上我正在使用基于Java的Matlab)。我同时使用了Java命令Runtime.getRuntime().exec(....)和Matlabsystem(....)。结果是一样的:无法启动屏幕键盘。在谷歌上我找不到任何可行的解决方案,所以我试图将两个想法结合起来并升级上面的答案:
我的解决方案是从重定向文件夹sysnative中显式启动64位cmd(对于osk.exe不可能,这会导致找不到或权限错误)。 Runtime.getRuntime().exec('C:\windows\sysnative\cmd /c C:\Windows\system32\osk.exe'); 希望这有所帮助。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接