Использование JNA SetForeGroundWindow - PullRequest
1 голос
/ 06 января 2020

В данный момент я пытаюсь использовать JNA для фокусировки не Java приложения, и я нашел следующий код.

import com.sun.jna.platform.win32.User32;
import com.sun.jna.platform.win32.WinDef.HWND;
public class win32functions{
    public static void setFocusToWindowsApp(String applicationTitle, int windowState) {
        int state = windowState;
            switch (state) {
            default:
            case 0:
                state = User32.SW_SHOWNORMAL;
                break;
            case 1:
                state = User32.SW_SHOWMAXIMIZED;
                break;
            case 2:
                state = User32.SW_SHOWMINIMIZED;
                break;
        }
        User32 user32 = User32.INSTANCE;
        HWND hWnd = user32.FindWindow(null, applicationTitle);
        if (user32.IsWindowVisible(hWnd)) {
            if (state != User32.SW_SHOWMINIMIZED) {
                user32.ShowWindow(hWnd, User32.SW_SHOWMINIMIZED);
            }
            user32.ShowWindow(hWnd, state);
            user32.SetFocus(hWnd);
        }
    }
}

Я также поместил следующие зависимости в свой pom. xml, проект бесплатный sh с главным файлом.

<properties>
<jna.version>5.5.0</jna.version>
</properties>


<dependencies>
<dependency>
    <groupId>net.java.dev.jna</groupId>
    <artifactId>jna</artifactId>
    <version>${jna.version}</version>
</dependency>
<dependency>
    <groupId>net.java.dev.jna</groupId>
    <artifactId>jna-platform</artifactId>
    <version>${jna.version}</version>
</dependency>
</dependencies>

Это точка входа в нашу Программу:

public class EntryPoint{

    public static void main(String[] args) throws Exception
    {
          win32functions.setFocusToWindowsApp("Google Chrome", 0);
    }
}

Теоретически, на Компиляция / запуск Программы должен просто сосредоточиться на Google Chrome, который открывается во время работы.

Однако Java выдает следующее сообщение об ошибке:

Exception in thread "main" java.lang.NoSuchMethodError: 'com.sun.jna.Library com.sun.jna.Native.load(java.lang.String, java.lang.Class, java.util.Map)'
at com.sun.jna.platform.win32.User32.<clinit>(User32.java:49)
at win32functions.setFocusToWindowsApp(win32functions.java:21)
at EntryPoint.main(EntryPoint.java:16)

Единственная ссылка, которую я Эта проблема была обнаружена в NoSuchMethodError с использованием карты платформы JNA User32

Это была почти та же ошибка, и решением было просто изменить версию JNA и JNA-платформы. Тем не менее, в моих Maven Dependencies я использую одну и ту же версию для платформы и JNA. Может кто-нибудь дать мне некоторое представление? Я на самом деле очень отчаялся, поэтому я спрашиваю здесь.

1 Ответ

0 голосов
/ 06 января 2020

Исключение указывает на ту же самую непосредственную причину, по которой ваш связанный вопрос имел, в частности, ваш проект не может найти версию JNA 5.x класса Native (с методом load(String, Class, Map) ), предлагая иметь более старую версию класса com.sun.jna.Native на вашем пути к классам.

Похоже, вы уже подозревали об этом, и ваша выдержка pom.xml выглядит правильно в отдельности, но вы этого не сделали учитывая достаточный контекст, чтобы знать, есть ли еще одна распространенная ошибка, которая приводит к загрузке неправильной версии. Одно из следующих действий должно помочь решить вашу проблему:

  • Убедитесь, что вы сначала перечислили зависимости jna и jna-platform в файле pom.xml самого высокого уровня в своем проекте. Если у вас есть другие зависимости, которые транзитивно загружают более раннюю версию JNA, они могут обрабатывать их в первую очередь.
  • Убедитесь, что вы выполнили команду для обновления / обновления / перезагрузки зависимостей проекта на основе последней pom.xml файл.
    • Если вы используете командную строку, mvn install или mvn package должны выполнить sh это.
    • Если вы используете IDE, найдите команду меню для выполнения sh это. Например, в Eclipse вам нужно использовать Maven > Update Project.
  • Убедитесь, что вы не указали вручную какой-либо другой jar / пакет в вашем classpath (особенно за пределами Maven), который включает старшее Native.jar. Spring Boot является распространенным виновником здесь.
  • Попробуйте удалить кэш репозитория maven и перестроить его, если у вас более старая кэшированная версия и по какой-то причине обновление не удается.
...