Страницы

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

суббота, 8 февраля 2020 г.

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

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

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

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