diff --git a/src/main/java/xyz/wbsite/jmacro/util/WindowsUtil.java b/src/main/java/xyz/wbsite/jmacro/util/WindowsUtil.java
index 3e0d592..1b8ca08 100644
--- a/src/main/java/xyz/wbsite/jmacro/util/WindowsUtil.java
+++ b/src/main/java/xyz/wbsite/jmacro/util/WindowsUtil.java
@@ -6,11 +6,21 @@ import com.sun.jna.platform.win32.WinDef;
import com.sun.jna.platform.win32.WinUser;
import com.sun.jna.win32.W32APIOptions;
+import java.util.ArrayList;
+import java.util.List;
+
/**
* 窗口工具类
*
* 可以打印窗口句柄和窗口信息
* 可以根据关键词匹配窗口句柄
+ *
+ * 如果使用的依赖树不含jna库,需要添加以下依赖
+ *
+ * net.java.dev.jna
+ * jna
+ * 5.14.0
+ *
*
* @author wangbing
* @version 0.0.1
@@ -139,11 +149,119 @@ public class WindowsUtil {
}, null);
}
- public static WinDef.HWND findWindow(String className, String windowName) {
- return User32.INSTANCE.FindWindow(className, windowName);
+ /**
+ * 查找窗口
+ *
+ * @param className 类名
+ * @param windowName 窗口名
+ * @return 窗口句柄
+ */
+ public static List findWindow(String className, String windowName) {
+ // 实际使用中,发现这个方法返回存在误差,可能返回的不是我们想要的
+ // User32.INSTANCE.FindWindow(className, windowName);
+
+ List windowInfos = new ArrayList<>();
+ User32.INSTANCE.EnumWindows((hWnd, data) -> {
+ if (!User32.INSTANCE.IsWindowVisible(hWnd)) {
+ return true;
+ }
+
+ // 获取类名
+ char[] classNameBuffer = new char[512];
+ User32.INSTANCE.GetClassNameW(hWnd, classNameBuffer, 512);
+ String actualClassName = Native.toString(classNameBuffer);
+
+ // 获取窗口标题
+ char[] windowText = new char[512];
+ User32.INSTANCE.GetWindowTextW(hWnd, windowText, 512);
+ String title = Native.toString(windowText);
+
+ // 双重条件匹配
+ boolean classMatches = (className == null || actualClassName.equals(className));
+ boolean titleMatches = (windowName == null || title.contains(windowName));
+
+ if (classMatches && titleMatches) {
+ windowInfos.add(parseWindowInfo(hWnd));
+ }
+ return true;
+ }, null);
+
+ return windowInfos;
+ }
+
+ // 在现有类中添加私有方法
+ private static WindowInfo parseWindowInfo(WinDef.HWND hWnd) {
+ char[] className = new char[512];
+ User32.INSTANCE.GetClassNameW(hWnd, className, 512);
+
+ char[] windowText = new char[512];
+ User32.INSTANCE.GetWindowTextW(hWnd, windowText, 512);
+
+ WinDef.RECT rect = new WinDef.RECT();
+ if (User32.INSTANCE.GetWindowRect(hWnd, rect)) {
+ return new WindowInfo(
+ Native.toString(className),
+ Native.toString(windowText),
+ // x坐标
+ rect.left,
+ // y坐标
+ rect.top,
+ // 宽度
+ rect.right - rect.left,
+ // 高度
+ rect.bottom - rect.top,
+ hWnd
+ );
+ }
+ return null;
}
- public static void main(String[] args) {
- printWindowInfo("微信");
+ public static class WindowInfo {
+ private final String className;
+ private final String windowName;
+ private final int x;
+ private final int y;
+ private final int width;
+ private final int height;
+ private final WinDef.HWND hWnd;
+
+ public WindowInfo(String className, String windowName, int x, int y,
+ int width, int height, WinDef.HWND hWnd) {
+ this.className = className;
+ this.windowName = windowName;
+ this.x = x;
+ this.y = y;
+ this.width = width;
+ this.height = height;
+ this.hWnd = hWnd;
+ }
+
+ public String getClassName() {
+ return className;
+ }
+
+ public String getWindowName() {
+ return windowName;
+ }
+
+ public int getX() {
+ return x;
+ }
+
+ public int getY() {
+ return y;
+ }
+
+ public int getWidth() {
+ return width;
+ }
+
+ public int getHeight() {
+ return height;
+ }
+
+ public WinDef.HWND gethWnd() {
+ return hWnd;
+ }
}
}