从任务栏最大化来自 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 文件可能会有用。不过要提醒一句,这是一个课程项目,它的抽象层多得令人作呕。
如果我的任务栏中有一个最小化的进程,有什么方法可以从 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 文件可能会有用。不过要提醒一句,这是一个课程项目,它的抽象层多得令人作呕。