从任务栏的java中最大化进程

时间:2017-03-28 03:08:33

标签: java

如果我的任务栏中有一个最小化的进程,有没有办法从java中最大化它?

我知道这个过程的名称,但它可能吗?

1 个答案:

答案 0 :(得分:2)

您最好的选择可能是使用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),则需要一个自定义函数映射器来执行更改(usage example,类definition

要查找并显示您的窗口(请注意,我还没有对此进行测试,如果它不起作用,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文件可能有用。但是,这是一个警示,这是一个课程项目,它具有令人作呕的多层抽象。