如果我的任务栏中有一个最小化的进程,有没有办法从java中最大化它?
我知道这个过程的名称,但它可能吗?
答案 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文件可能有用。但是,这是一个警示,这是一个课程项目,它具有令人作呕的多层抽象。