记一次Java Win32 Api使用

3,199 阅读2分钟

用途

使用java程序,操作windows窗口程序

依赖

<dependency>
    <groupId>net.java.dev.jna</groupId>
    <artifactId>jna-platform</artifactId>
    <version>4.4.0</version>
</dependency>

官方文档

官方文档

API

前置

// 导包
import com.sun.jna.platform.win32.User32;
import com.sun.jna.platform.win32.WinDef;
import com.sun.jna.platform.win32.WinUser;

import java.awt.*;
import java.awt.event.InputEvent;
import java.awt.event.KeyEvent;

// 静态属性
public static User32 instance = User32.INSTANCE;
private static String lpWindowName = "Wind金融终端..Everest";

查找窗口

使用

WinDef.HWND hwnd = instance.FindWindow(null, lpWindowName);

说明

HWND FindWindow(String lpClassName, String lpWindowName);

lpClassName 设为null
lpWindowName windows 窗口标题
HWND 返回值:窗体句柄

显示前置窗口

使用

// 显示窗口
log.info("显示窗口.");
instance.ShowWindow(hwnd, WinUser.SW_RESTORE);
// 前置窗口
instance.SetForegroundWindow(hwnd);

说明

显示窗口

boolean ShowWindow(HWND hWnd, int nCmdShow);

hWnd 窗体句柄
nCmdShow 控制窗口如何显示
boolean 返回值:方法是否调用成功

前置窗口

boolean SetForegroundWindow(HWND hWnd);

前置并激活窗口

获取窗口[矩形]及大小

使用

    /**
     * 获取矩形
     *
     * @param hwnd
     * @return
     */
    private static WinDef.RECT getRect(WinDef.HWND hwnd) {
        WinDef.RECT winRect = new WinDef.RECT();
        instance.GetWindowRect(hwnd, winRect);
        return winRect;
    }

    /**
     * 获取宽度
     * @param rect
     * @return
     */
    private static int getWidth(WinDef.RECT rect) {
        return rect.right - rect.left;
    }

    /**
     * 获取高度
     * @param rect
     * @return
     */
    private static int getHeight(WinDef.RECT rect) {
        return rect.bottom - rect.top;
    }
    
     /**
     * 获取宽度
     * @param hwnd
     * @return
     */
    private static int getWidth(WinDef.HWND hwnd) {
        WinDef.RECT rect = getRect(hwnd);
        return getWidth(rect);
    }

说明

可根据窗口宽度判断是真正否打开窗口

getWidth(hwnd) != 0

设置窗口大小

使用

log.info("设置窗口大小.");
instance.SetWindowPlacement(hwnd, new WinUser.WINDOWPLACEMENT());
instance.SetWindowPos(hwnd, null, 0, 0, 800, 900, 0x40);

说明

设置窗口特点状态
BOOL SetWindowPlacement(HWND hwnd, WINDOWPLACEMENT lpwndpl);

hwnd 窗体句柄 lpwndpl 恢复,最小化,最大化,暂不清除使用方式。

设置窗口位置

官方文档-SetWindowPos

boolean SetWindowPos(HWND hWnd, HWND hWndInsertAfter, int X, int Y, int cx,
                         int cy, int uFlags);

hWnd 窗口句柄
hWndInsertAfter z层级上,在此参数窗口之前显示
X 左边距,坐标 Y 上边距,坐标
cx 宽度(像素)
cy 高度(像素)
uFlags 窗口大小和位置标志 SWP_SHOWWINDOW,0x0040 ,Displays the window.