Java 的 HWND

简介

HWND 是 Windows 系统中用来标识窗口的句柄类型,在 Java 中,通过一些特定的方法可以获取和操作 HWND。本文将介绍 Java 中 HWND 的概念、使用方法以及相关的代码示例。

什么是 HWND

HWND 是句柄(Handle)类型的一种,它用来标识 Windows 系统中的窗口。在 Windows 系统中,每个窗口都有一个唯一的 HWND 值,可以通过它来操作和管理窗口。在 Java 中,HWND 是一个整数类型的值。

获取 HWND

Java 中获取 HWND 的方法是通过调用原生操作系统的 API 来实现的。在 Java 中,可以使用 JNA(Java Native Access)库来访问操作系统的原生 API,从而获取 HWND。

下面是一个使用 JNA 获取 HWND 的示例代码:

import com.sun.jna.Native;
import com.sun.jna.Pointer;
import com.sun.jna.platform.win32.WinDef;
import com.sun.jna.platform.win32.WinUser;

public class HwndExample {
    public static void main(String[] args) {
        // 获取当前窗口的 HWND
        WinDef.HWND hwnd = User32.INSTANCE.GetForegroundWindow();
        System.out.println("HWND: " + hwnd.getPointer());
    }
}

interface User32 extends com.sun.jna.platform.win32.User32 {
    User32 INSTANCE = Native.load("user32", User32.class);

    // 获取当前窗口的 HWND
    WinDef.HWND GetForegroundWindow();
}

在上面的示例代码中,通过调用 User32.INSTANCE.GetForegroundWindow() 方法可以获取当前窗口的 HWND。GetForegroundWindow() 方法是 User32 接口中定义的一个原生 API,用来获取当前活动窗口的 HWND。

操作 HWND

获取到 HWND 之后,可以通过一些特定的方法来操作和管理窗口。

窗口标题

可以使用 User32.INSTANCE.GetWindowText() 方法来获取窗口的标题:

import com.sun.jna.Native;
import com.sun.jna.platform.win32.WinDef;
import com.sun.jna.platform.win32.WinUser;

public class HwndExample {
    public static void main(String[] args) {
        // 获取当前窗口的 HWND
        WinDef.HWND hwnd = User32.INSTANCE.GetForegroundWindow();
        
        // 获取窗口标题
        char[] buffer = new char[255];
        User32.INSTANCE.GetWindowText(hwnd, buffer, buffer.length);
        String title = Native.toString(buffer);
        
        System.out.println("窗口标题: " + title);
    }
}

interface User32 extends com.sun.jna.platform.win32.User32 {
    User32 INSTANCE = Native.load("user32", User32.class);

    // 获取当前窗口的 HWND
    WinDef.HWND GetForegroundWindow();
    
    // 获取窗口标题
    int GetWindowText(WinDef.HWND hWnd, char[] lpString, int nMaxCount);
}

窗口位置和尺寸

可以使用 User32.INSTANCE.GetWindowRect() 方法来获取窗口的位置和尺寸:

import com.sun.jna.Native;
import com.sun.jna.platform.win32.WinDef;
import com.sun.jna.platform.win32.WinUser;

public class HwndExample {
    public static void main(String[] args) {
        // 获取当前窗口的 HWND
        WinDef.HWND hwnd = User32.INSTANCE.GetForegroundWindow();
        
        // 获取窗口位置和尺寸
        WinDef.RECT rect = new WinDef.RECT();
        User32.INSTANCE.GetWindowRect(hwnd, rect);
        
        int x = rect.left;
        int y = rect.top;
        int width = rect.right - rect.left;
        int height = rect.bottom - rect.top;
        
        System.out.println("窗口位置: (" + x + ", " + y + ")");
        System.out.println("窗口尺寸: " + width + " x " + height);
    }
}

interface User32 extends com.sun.jna.platform.win32.User32 {
    User32 INSTANCE = Native.load("user32", User32.class);

    // 获取当前窗口的 HWND
    WinDef.HWND GetForegroundWindow();
    
    // 获取窗口位置和尺寸
    void GetWindowRect(WinDef.HWND hWnd, WinDef.RECT rect);
}

窗口消息

可以使用 User32.INSTANCE.PostMessage() 方法来向窗口发送消息:

import com.sun.jna.Native;
import com.sun.jna.platform.win32.WinDef;
import com.sun.jna.platform.win32.WinUser;

public class HwndExample {
    public static void main(String[] args) {
        // 获取当前窗口的 HWND
        Win