java - 从任务栏最大化 java 进程

标签 java jna

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

我知道进程的名称,但这可能吗?

最佳答案

您最好的选择可能是使用 Windows API。我用过Java Native Access之前执行过这样的任务。我发现这个库非常方便。

使用 JNA,您要做的就是使用共享库 (DLL) 的导出函数声明一个接口(interface),然后加载该库,从而代理该库。

我们感兴趣的 WinAPI 函数是以下 User32 函数:

HWND WINAPI FindWindow(LPCTSTR lpClassName, LPCTSTR lpWindowName); 

BOOL WINAPI ShowWindow(HWND hWnd, int  nCmdShow); 

我们的代理界面可能如下所示。该接口(interface)提供非常低级别的访问,因此在实践中您可能希望封装该功能。

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 文件可能有用。不过,请注意,这是一个类(class)项目,它具有令人厌恶的许多抽象层。

关于java - 从任务栏最大化 java 进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43059987/

相关文章:

java - 一般问题

java - 我面临 java.lang.StringIndexOutOfBoundsException :

java - JNA 按名称从进程获取模块

java - 使用 JNA 库使用 NetShareAdd windows Api 时出现无效参数错误

java - 在 Spring 中实现策略设计模式的最佳方式

java - Android 分享按钮没有出现,Material Design 不工作

java - 如何在Jsoup中关闭自动生成关闭标签</tagName>?

java - 为什么我的 JNA 结构映射会产生奇怪的字段值?

java - JNA java.lang.UnsatisfiedLinkError 和找不到指定的模块

java - JNA 对象在 java 代码中是按引用传递还是按值传递