Здравствуйте!
Есть программа написанная на 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 и преобразует нужным образом аргументы.
Комментариев нет:
Отправить комментарий