如果我的任务栏中有一个最小化的进程,有什么方法可以从 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/