从任务栏最大化来自 java 的进程

Maximize process from java from taskbar

如果我的任务栏中有一个最小化的进程,有什么方法可以从 java 中最大化它?

我知道进程的名称,但是可以吗?

您最好的选择可能是使用 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 风格的方法名称(驼峰式而不是 PascalCase),您需要一个自定义函数映射器来进行更改 (usage example, class definition)

找到并显示你的 window(注意,我还没有测试过这个,如果它不起作用,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 名称也必须完全匹配,否则 window 将为 0 (NULL),并且以下调用将失败。我也不确定 SW_RESTORE 是单独工作还是需要另一个标志来配合它。

如果你想遍历所有的过程来找到你感兴趣的过程,你可以查看我的lacuna project中的一些例子,windows/WindowsPidEnumerator.java 和 windows/WindowsNativeProcessCollector.java 文件可能会有用。不过要提醒一句,这是一个课程项目,它的抽象层多得令人作呕。