Skip to content

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 来获取错误信息。

注意事项:

  • 如果窗口是另一个线程的,必须确保正确的线程同步,避免获取不到标题或其他潜在的问题。