【问题标题】:Open the 64 bits windows's virtual keyboard using a 32 bit JRE使用 32 位 JRE 打开 64 位 windows 虚拟键盘
【发布时间】:2012-01-09 21:11:06
【问题描述】:

我需要从我的应用程序中打开 Windows 的虚拟键盘,它将使用 Eclipse RCP 在 windows 32 位平台(即 win32 JRE)上部署。

根据open the Windows virtual keyboard in a Java program 帖子的答案,应用程序在 32 位 Windows 操作系统上正确运行,但拒绝在 64 位 Windows 操作系统上运行。

我使用的解决方案如下:

//          String sysroot = System.getenv("SystemRoot"); //$NON-NLS-1$
//          Runtime.getRuntime().exec("cmd.exe /c "+sysroot + "\\system32\\osk.exe /n"); //$NON-NLS-1$ //$NON-NLS-2$
            Runtime.getRuntime().exec("osk");

有没有办法在不使用 64 位部署的情况下解决这个问题? (我无法创建,只要我使用的库不支持此环境)。

谢谢

【问题讨论】:

  • 如果您的 Java 应用程序是使用 32 位模式 JVM 在 32 位模式下编译/运行的,则您无法运行调用 64 位版本可执行文件的进程。比方说,Windows XP 32 位,因此它的 OSK.EXE 版本是 32 位;那么您的 Java 应用程序可以执行该过程,因为它使用 32 位模式 JVM 匹配。现在,假设 Windows 7 64 位,因此它的 OSK.exe 版本是 64 位,但是您的 Java 应用程序是使用 32 位模式 JVM 在 32 位模式下编译/运行的,那么您的应用程序将不会像它一样运行该进程不匹配。 see link
  • 感谢您的帮助。 ,这就是我的假设。如果我找到解决方法,我会将其发布在此帖子中
  • 这完全是 hack,但是如果您编写一个只调用可执行文件的小型本机包装器,并将该包装器设为 32 位呢?然后,您可以从您的 Java 代码执行包装器。包装器可以像 C/C++ 中的 system("osk"); 一样简单。
  • 我会尝试使用 .bat 文件来使用它,只是为了避免依赖 java - c++ 首先,但我会尝试按照你说的做。谢谢
  • 调用一个bat文件可能是个好主意,有兴趣了解

标签: java command 32bit-64bit on-screen-keyboard


【解决方案1】:

试试这个代码。不确定它会起作用。但值得一试。

Desktop desktop = null;
if (Desktop.isDesktopSupported()) 
{
    desktop = Desktop.getDesktop();
}
String sysroot = System.getenv("SystemRoot");
desktop.open(new File(sysroot+"/system32/osk.exe"));

我是这个桌面类的新手,我想知道这个类是否能做到这一点;)

【讨论】:

  • Desktop.open() 用于打开与文件关联的应用程序(例如文字处理器、文本编辑器等)。我怀疑您是否可以使用它运行可执行文件(但尚未尝试)
  • 其实我也想做同样的事情——打开可执行文件。由于 Desktop.open() 用于打开 Windows 配置(即文件类型引用),我希望在这种情况下不会出现 64 位问题。我运行了这段代码。它适用于我的机器..但我没有尝试使用不同的位参考。即:64 位 windows 和 32 位 jre。
【解决方案2】:

否。您将无法从 32 位 Java 应用程序和/或 32 位操作系统中使用 64 位库。 您必须部署您的应用 x64。

【讨论】:

    【解决方案3】:

    这是我的解决方法:

    FileOutputStream fileOutputStream = new FileOutputStream(new File("C:/TEMP/RUN.BAT"));
    
            String file = "START C:/Windows/System32/osk.exe" + '\n'
                    + "EXIT";
            fileOutputStream.write(file.getBytes());
            fileOutputStream.close();
            Runtime.getRuntime().exec("CMD /C START C:/TEMP/RUN.bat");
            Runtime.getRuntime().exec("CMD /C DEL C:/TEMP/RUN.bat");
    

    【讨论】:

      猜你喜欢
      • 2013-06-21
      • 1970-01-01
      • 2012-10-26
      • 1970-01-01
      • 1970-01-01
      • 2018-03-04
      • 1970-01-01
      • 1970-01-01
      • 2023-03-31
      相关资源
      最近更新 更多