#java #winapi #jni
Здравствуйте! Есть программа написанная на JAVA(модуль запускаемый как надстройка одновременно со сторонним приложением). Из этой java-программы (надстройки), необходимо менять заголовок окон сторонней программы. Я имею неплохие навыки программирования на java, но с подобными задачами еще не сталкивался. Я знаю, что есть JNI и JNA и куча сторонних библиотек, но в этой области я пока не опытен. Без проблем могу решить данную задачу на С++ или на Delphi. Но задача состоит в том, чтобы сделать изменение заголовка чужой программы средствами JAVA. Начальство очень не хочет плодить в проекте модули написанные не полностью на java (если никак по-другому - смирятся). Рассматриваю варианты по отлову handle, заголовков окна, по id-процесса, по классу окна... Боже! да как угодно -главное чтобы работало! С радостью приму от вас советы, ссылки, комментарии, и кусочки кода. Было бы отлично, если кто-то поделится исходником подобной задачи. Примеры с JNA , JNI приму с радостью!
Ответы
Ответ 1
Конечно, JNA — это ваш выбор. Надо скачать две JAR-ки здесь, либо подключить через maven. Вот набросал пример: import com.sun.jna.Native; import com.sun.jna.platform.win32.WinDef.HWND; import com.sun.jna.win32.StdCallLibrary; import com.sun.jna.win32.W32APIOptions; public class SetWindowTitle { public static interface User32 extends StdCallLibrary { final User32 instance = (User32) Native.loadLibrary ("user32", User32.class, W32APIOptions.UNICODE_OPTIONS); HWND FindWindow(String className, String windowName); boolean SetWindowText(HWND hwnd, String newText); } public static void main(String[] args) { if(args.length != 2) { System.out.println("Нужно два аргумента: имя окна (или класс) и новое имя"); return; } HWND hwnd = User32.instance.FindWindow(args[0], null); if(hwnd == null) { hwnd = User32.instance.FindWindow(null, args[0]); } if(hwnd == null) { System.out.println("Окно не найдено"); return; } System.out.println("Нашли окно: "+hwnd); boolean result = User32.instance.SetWindowText(hwnd, args[1]); System.out.println(result ? "Успешно" : "Упс"); } } Компилировать: javac -cp jna-4.1.0.jar;jna-platform-4.1.0.jar;. SetWindowTitle.java Запускать java -cp jna-4.1.0.jar;jna-platform-4.1.0.jar;. SetWindowTitle "old-title" "new-title" JNA очень удобно работает. Вы просто объявляете в вашем интерфейсе методы с теми же именами, что в user32 и с совместимой сигнатурой. Внутри JNA создаёт Proxy-класс, который для каждого метода поищет соответствующий внутри user32.dll и преобразует нужным образом аргументы.
Комментариев нет:
Отправить комментарий