使用 JNA SetForeGroundWindow

Posted

技术标签:

【中文标题】使用 JNA SetForeGroundWindow【英文标题】:Using JNA SetForeGroundWindow 【发布时间】:2020-04-23 16:39:10 【问题描述】:

目前我正在尝试使用 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 中,该项目是一个只有一个主文件的新项目。

<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);
    

理论上,在编译/运行时,程序应该只关注运行时打开的谷歌浏览器。

但是,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 using JNA User32 platform map

这几乎是相同的错误,解决方案是更改 JNA 和 JNA-platform 的版本。 但是,在我的 Maven 依赖项中,我对平台和 JNA 使用相同的版本。有人可以给我一些见解吗?我真的很绝望,所以我才在这里问。

【问题讨论】:

【参考方案1】:

异常指向与您的链接问题相同的直接错误原因,具体来说,您的项目找不到 Native 类的 JNA 5.x 版本(使用 load(String, Class, Map) 方法),这表明您有一个类路径中 com.sun.jna.Native 类的旧版本。

您似乎已经怀疑这一点,并且您的pom.xml 摘录单独看起来是正确的,但是您没有提供足够的上下文来了解是否存在另一个导致加载错误版本的常见错误。以下操作之一应该有助于解决您的问题:

确保在项目的***别 pom.xml 文件中首先列出了 jnajna-platform 依赖项。如果您有任何其他依赖项可以传递加载早期版本的 JNA,它们可能会首先处理它们。 确保您已根据最新的pom.xml 文件执行更新/刷新/重新加载项目依赖项的命令。 如果您使用命令行,mvn installmvn package 应该可以完成此操作。 如果您使用的是 IDE,请查找菜单命令来完成此操作。例如,在 Eclipse 中,您需要使用Maven &gt; Update Project。 确保您没有在您的类路径中手动指定任何其他 jar/包(尤其是在 Maven 之外),其中包括旧的 Native.jar。 Spring Boot 是一个常见的罪魁祸首。 尝试deleting your maven repository cache 并让它重建,以防您有较旧的缓存版本并且由于某种原因更新失败。

【讨论】:

以上是关于使用 JNA SetForeGroundWindow的主要内容,如果未能解决你的问题,请参考以下文章

使用 JNA SetForeGroundWindow

java使用JNA框架调用dll动态库

调用使用 Java + JNA 的 WinInet 函数

Java中jna的用法

使用JNA读取dll文件

32 位 JRE 中的 jna 指针