Страницы

Поиск по вопросам

пятница, 12 апреля 2019 г.

Java вызов WinApi функций или управление открытыми окнами чужих программ

Здравствуйте!
Есть программа написанная на JAVA(модуль запускаемый как надстройка одновременно со сторонним приложением).
Из этой java-программы (надстройки), необходимо менять заголовок окон сторонней программы.
Я имею неплохие навыки программирования на java, но с подобными задачами еще не сталкивался. Я знаю, что есть JNI и JNA и куча сторонних библиотек, но в этой области я пока не опытен.
Без проблем могу решить данную задачу на С++ или на Delphi.
Но задача состоит в том, чтобы сделать изменение заголовка чужой программы средствами JAVA
Начальство очень не хочет плодить в проекте модули написанные не полностью на java (если никак по-другому - смирятся)
Рассматриваю варианты по отлову handle, заголовков окна, по id-процесса, по классу окна... Боже! да как угодно -главное чтобы работало!
С радостью приму от вас советы, ссылки, комментарии, и кусочки кода.
Было бы отлично, если кто-то поделится исходником подобной задачи.
Примеры с JNA , JNI приму с радостью!


Ответ

Конечно, 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 и преобразует нужным образом аргументы.

Комментариев нет:

Отправить комментарий