Откройте виртуальную клавиатуру 64-битных окон с помощью 32-битной JRE.

Мне нужно открыть виртуальную клавиатуру Windows из моего приложения, которое будет развернуто с помощью Eclipse RCP на 32-битной платформе Windows (т.е. Win32 JRE).

Следуя ответам на сообщение откройте виртуальную клавиатуру Windows в программе Java , приложения делают это правильно в 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-битного развертывания? (которую я не могу создать, пока использую библиотеку, которая не поддерживает эту среду).

Спасибо


person Josep Rodríguez López    schedule 30.11.2011    source источник
comment
Если ваше Java-приложение компилируется/запускается в 32-разрядном режиме с использованием JVM в 32-разрядном режиме, вы не можете запустить процесс, который вызывает 64-разрядную версию исполняемого файла. Скажем, Windows XP 32-разрядная, следовательно, ее версия OSK.EXE является 32-разрядной; тогда ваше Java-приложение может выполнить этот процесс, поскольку оно соответствует использованию JVM в 32-битном режиме. Теперь, допустим, 64-разрядная версия Windows 7, следовательно, ее версия OSK.exe является 64-разрядной, но ваше Java-приложение компилируется/запускается в 32-разрядном режиме с использованием JVM в 32-разрядном режиме, тогда ваше приложение не будет запускать процесс, поскольку он не совпадает. см. ссылку   -  person ee.    schedule 01.12.2011
comment
Спасибо за помощь э. , это моя гипотеза. Если я найду обходной путь, я опубликую его в этом посте   -  person Josep Rodríguez López    schedule 01.12.2011
comment
Это полный хак, но что, если вы написали крошечную нативную оболочку, которая просто вызывала исполняемый файл, и сделали эту оболочку 32-битной? Затем вы можете выполнить оболочку из своего кода Java. Оболочка может быть такой же простой, как system("osk"); в C/C++.   -  person aardvarkk    schedule 12.12.2011
comment
Я попытаюсь использовать файл .bat, используя это, просто чтобы сначала избежать зависимости java-c++, но я попытаюсь сделать то, что вы сказали. Спасибо   -  person Josep Rodríguez López    schedule 12.12.2011
comment
вызов файла bat может быть хорошей идеей, интересно узнать   -  person Kowser    schedule 13.12.2011
comment
Файл bat не решил проблему... Я попытаюсь скомпилировать программу на С++ и опубликовать результаты здесь.   -  person Josep Rodríguez López    schedule 14.12.2011
comment
Если нет абсолютной необходимости использовать экранную клавиатуру Windows, я бы создал свою собственную экранную клавиатуру, чтобы моя программа была кроссплатформенной.   -  person Jeffrey    schedule 19.12.2011


Ответы (3)


Попробуйте этот код. не уверен, что это сработает. но стоит попробовать.

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

Я новичок в этом классе Desktop, и я хотел бы знать, помогает ли класс;)

person Naveen Babu    schedule 14.12.2011
comment
Desktop.open() используется для открытия приложения, связанного с файлом (например, текстового процессора, текстового редактора и т. д.). Я сомневаюсь, что вы можете запустить с ним исполняемый файл (но не пробовал) - person a_horse_with_no_name; 14.12.2011
comment
На самом деле я хотел сделать то же самое - открыть исполняемый файл. поскольку Desktop.open() раньше открывался с конфигурацией Windows (т.е. ссылкой на тип файла), я надеялся, что в этом случае 64-битная проблема не появится. я запустил этот код. и это работает на моей машине .. но я не пробовал с другой битовой ссылкой. то есть: 64-битные окна и 32-битные jre. - person Naveen Babu; 14.12.2011

Нет. Вы не сможете использовать 64-разрядную библиотеку из 32-разрядного приложения Java и/или 32-разрядной ОС. Вам придется развернуть приложение x64.

person one.beat.consumer    schedule 16.12.2011

это мой обходной путь:

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");
person user1097489    schedule 19.12.2011