user32.dll 中哪一个方法可以通过 hwnd 获取 窗口标题的? hwnd 已经知道是一个 int32
在 user32.dll
中,你可以使用 GetWindowText
函数来通过窗口句柄 (HWND
) 获取窗口的标题。具体来说,这个函数需要传入窗口的句柄,以及一个缓冲区用于存储获取到的标题文本。
函数签名如下:
c
int GetWindowTextA(
HWND hWnd,
LPSTR lpString,
int nMaxCount
);
hWnd
:窗口句柄 (int32)。lpString
:一个用于存储窗口标题的缓冲区。nMaxCount
:缓冲区的大小,即可以存放的最大字符数。
示例代码:
desktop.js
js
const koffi = require("koffi");
// 加载user32.dll
const user32 = koffi.load("user32.dll");
// 定义 HANDLE 和 HWND
const HANDLE = koffi.pointer("HANDLE", koffi.opaque());
const HWND = koffi.alias("HWND", HANDLE);
// 定义 EnumWindowsProc 回调函数的签名
const EnumWindowsProc = koffi.proto(
"bool __stdcall EnumWindowsProc(int32, int32)"
);
// 定义 EnumWindows 函数的签名,注意这里使用 koffi.pointer 传递函数指针
const EnumWindows = user32.func("__stdcall", "EnumWindows", "bool", [
koffi.pointer(EnumWindowsProc),
"int",
]);
// 定义 GetWindowTextA 函数的签名
// GetWindowTextA:https://learn.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-getwindowtexta
const GetWindowTextA = user32.func("__stdcall", "GetWindowTextA", "bool", [
"int32",
"string", // 用于接收窗口标题的字符串缓冲区
"int",
]);
// 枚举窗口的回调函数
let cb1 = koffi.register((hwnd, lParam) => {
console.log("[hwnd, lParam]", hwnd, lParam);
const buffer = Buffer.alloc(256); // 分配一个缓冲区存放标题
// 获取窗口标题
GetWindowTextA(hwnd, buffer, 256);
// 输出获取到的标题
console.log("Window Title:", buffer.toString("utf-8"));
// 返回 true 继续枚举,返回 false 停止枚举
return true;
}, koffi.pointer(EnumWindowsProc)); // 传递回调签名
// 调用 EnumWindows 来列举所有顶级窗口,传递回调函数指针
EnumWindows(cb1, 0);
koffi.unregister(cb1);
console.log("EnumWindowsProc", EnumWindowsProc);
执行代码
powershell
node desktop.js
GetWindowTextA 介绍
GetWindowTextA:https://learn.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-getwindowtexta
微软官方文档中的 GetWindowTextA
定义可以在 微软的官方文档页面 上找到。下面是 GetWindowTextA
函数的官方定义和说明的简要摘录:
函数定义:
c
int GetWindowTextA(
HWND hWnd,
LPSTR lpString,
int nMaxCount
);
参数说明:
hWnd
:
要检索其标题栏文本的窗口句柄。如果该窗口是控件,则该控件的文本将被检索。lpString
:
指向一个缓冲区,用于接收窗口标题文本(以 null 终止的字符串)。如果该窗口没有标题栏或文本,则缓冲区接收到一个空字符串。nMaxCount
:
指定要复制到缓冲区的最大字符数。如果窗口标题大于指定的字符数,标题会被截断。
返回值:
返回复制到缓冲区的字符数(不包括空终止符)。如果窗口没有标题栏或控件没有文本,返回值为 0。若函数失败,返回值为 0,且可通过 GetLastError
来获取错误信息。
注意事项:
- 如果窗口是另一个线程的,必须确保正确的线程同步,避免获取不到标题或其他潜在的问题。