使用 JNA SetForeGroundWindow
Using JNA SetForeGroundWindow
目前我正在尝试使用 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);
}
}
理论上,在 compilation/run 上程序应该只关注 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)
我找到的关于这个问题的唯一参考是这个
几乎是同样的错误,解决方法是更改 JNA 和 JNA-platform 的版本。
但是,在我的 Maven 依赖项中,我对平台和 JNA 使用相同的版本。有人可以给我一些见识吗?我真的很绝望,这就是为什么我在这里问。
该异常指向与您的链接问题相同的直接错误原因,具体来说,您的项目找不到 Native
class 的 JNA 5.x 版本(带有load(String, Class, Map)
方法),建议您在 class 路径上使用旧版本的 com.sun.jna.Native
class。
看起来您已经怀疑到这一点,并且您的 pom.xml
摘录单独看来是正确的,但您没有提供足够的上下文来了解是否存在另一个导致错误版本的常见错误加载。以下操作之一应该有助于解决您的问题:
- 确保您在项目的最高级别
pom.xml
文件中首先列出了 jna
和 jna-platform
依赖项。如果您有任何其他依赖项可以传递加载早期版本的 JNA,它们可能会首先处理它们。
- 确保您已根据最新的
pom.xml
文件对 update/refresh/reload 项目依赖项执行命令。
- 如果您使用的是命令行,
mvn install
或 mvn package
应该可以完成此操作。
- 如果您使用的是 IDE,请查找菜单命令来完成此操作。比如在Eclipse中,需要使用
Maven > Update Project
.
- 确保您没有在 class 路径(尤其是 Maven 之外)中手动指定任何其他 jar/package,其中包括旧的
Native.jar
。 Spring 引导是这里的常见罪魁祸首。
- 尝试 deleting your maven repository cache 并让它重建,以防您有较旧的缓存版本并且由于某种原因更新失败。
目前我正在尝试使用 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);
}
}
理论上,在 compilation/run 上程序应该只关注 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)
我找到的关于这个问题的唯一参考是这个
几乎是同样的错误,解决方法是更改 JNA 和 JNA-platform 的版本。 但是,在我的 Maven 依赖项中,我对平台和 JNA 使用相同的版本。有人可以给我一些见识吗?我真的很绝望,这就是为什么我在这里问。
该异常指向与您的链接问题相同的直接错误原因,具体来说,您的项目找不到 Native
class 的 JNA 5.x 版本(带有load(String, Class, Map)
方法),建议您在 class 路径上使用旧版本的 com.sun.jna.Native
class。
看起来您已经怀疑到这一点,并且您的 pom.xml
摘录单独看来是正确的,但您没有提供足够的上下文来了解是否存在另一个导致错误版本的常见错误加载。以下操作之一应该有助于解决您的问题:
- 确保您在项目的最高级别
pom.xml
文件中首先列出了jna
和jna-platform
依赖项。如果您有任何其他依赖项可以传递加载早期版本的 JNA,它们可能会首先处理它们。 - 确保您已根据最新的
pom.xml
文件对 update/refresh/reload 项目依赖项执行命令。- 如果您使用的是命令行,
mvn install
或mvn package
应该可以完成此操作。 - 如果您使用的是 IDE,请查找菜单命令来完成此操作。比如在Eclipse中,需要使用
Maven > Update Project
.
- 如果您使用的是命令行,
- 确保您没有在 class 路径(尤其是 Maven 之外)中手动指定任何其他 jar/package,其中包括旧的
Native.jar
。 Spring 引导是这里的常见罪魁祸首。 - 尝试 deleting your maven repository cache 并让它重建,以防您有较旧的缓存版本并且由于某种原因更新失败。