从任务栏最大化Java进程

4
如果我在任务栏中将一个进程最小化了,有没有办法从 Java 中将其最大化?
我知道这个进程的名称,但是否可能呢?

这是您想要启动的程序还是其他任意程序?您是专门针对Windows还是其他操作系统进行开发? - cbr
@cubrr 我只针对Windows操作系统。我想启动一个已经在运行的进程。 - Eugen Valentin
更准确地说,从任务栏打开一个游戏。 - Eugen Valentin
1个回答

3
你最好使用Windows API。我以前在类似的任务中使用过Java Native Access。我发现这个库非常方便。
使用JNA,你需要声明一个接口,其中包含共享库(DLL)的导出函数,然后加载该库,从而获得该库的代理。
我们感兴趣的WinAPI函数是以下User32函数:
HWND WINAPI FindWindow(LPCTSTR lpClassName, LPCTSTR lpWindowName); 

BOOL WINAPI ShowWindow(HWND hWnd, int  nCmdShow); 

我们的代理接口可能如下所示。这个接口提供非常低级别的访问,因此实际上您可能希望封装功能。
import com.sun.jna.win32.StdCallLibrary;

interface User32 extends StdCallLibrary {
    // https://msdn.microsoft.com/en-us/library/windows/desktop/ms633499(v=vs.85).aspx
    int FindWindowA(String className, String windowName);
    // https://msdn.microsoft.com/en-us/library/windows/desktop/ms633548(v=vs.85).aspx
    boolean ShowWindow(int window, int command);
}

注意函数名称必须与API函数的名称完全匹配。如果您想使用Java风格的方法名称(camelCase而不是PascalCase),则需要一个自定义函数映射器来进行更改(用法示例,类定义)。
要查找并显示窗口(请注意,我没有测试过这个,如果不起作用,Windows API文档将帮助您):
import com.sun.jna.Native;

public class Program {
    private static final int SW_RESTORE = 9;

    public static void main(String[] args) {
        User32 user32 = Native.loadLibrary("User32.dll", User32.class);
        int window = user32.FindWindowA(null, "Google Chrome");
        boolean success = user32.ShowWindow(window, SW_RESTORE);
        if (success) {
            System.out.println("Success");
        } else {
            System.out.println("Fail: " + Native.getLastError());
        }
    }
}

请注意窗口名称必须完全匹配,否则window将为0(NULL),导致以下调用失败。我不确定 SW_RESTORE 是否需要单独使用或是否需要与其他标志一起使用。
如果您想枚举所有进程以找到感兴趣的进程,您可以查看 lacuna project 中的一些示例,windows/WindowsPidEnumerator.java 和 windows/WindowsNativeProcessCollector.java 文件可能会有所帮助。但要注意,这是一个课程项目,它具有许多令人讨厌的抽象层。

不确定是否正确,但这是我尝试的内容:https://pastebin.com/8Gw1qHAp @cubrr - Eugen Valentin
@EugenValentin 接口内所需的仅是 winapi 方法。是否达到了您的期望?如果没有,发生了什么情况? - cbr
没有像预期的那样工作,出现了错误:@cubrr - Eugen Valentin
错误:在类 bugged.test 中未找到 main 方法,请定义 main 方法为: public static void main(String[] args) 或 JavaFX 应用程序类必须扩展 javafx.application.Application。 - Eugen Valentin
@EugenValentin 我建议你在StackOverflow上搜索这个错误,因为它非常普遍。同时请记得下载JNA库或将其添加到你的项目依赖中,如果你熟悉这个过程的话。 - cbr

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接