这是一个在 Windows API(应用程序编程接口)中非常常用的函数,主要用于获取指定窗口的标题文本(Caption)或控件的内容(例如文本框中的文字)。

(图片来源网络,侵删)
函数原型
GetWindowText 函数在 windows.h 头文件中声明,其原型如下:
int GetWindowText( HWND hWnd, // 窗口的句柄 LPTSTR lpString, // 用于接收文本的缓冲区 int nMaxCount // 缓冲区的最大字符数 );
参数详解
-
hWnd(HWND):- 类型:
HWND(Handle to a Window),即窗口句柄。 - 作用: 指定你想要获取文本的那个窗口的句柄。
- 如何获取句柄:
- 如果你自己的程序创建了窗口,通常在窗口过程(
WndProc)中会收到这个句柄作为参数。 - 如果你想要获取其他程序的窗口句柄,可以使用
FindWindow,FindWindowEx,EnumWindows等函数。 - 获取当前活动窗口句柄可以使用
GetForegroundWindow()。
- 如果你自己的程序创建了窗口,通常在窗口过程(
- 类型:
-
lpString(LPTSTR):- 类型:
LPTSTR,这是一个指向字符串的指针。 - 作用: 这是一个输出参数,函数会将窗口的文本复制到你提供的这个内存缓冲区中。
- 重要: 你必须自己分配这个缓冲区的内存,通常使用一个字符数组来提供。
- 类型:
-
nMaxCount(int):
(图片来源网络,侵删)- 类型:
int,一个整数值。 - 作用: 指定
lpString缓冲区能容纳的最大字符数(包括结尾的空字符\0)。 - 为什么重要: 这是防止缓冲区溢出(Buffer Overflow)的关键,如果你提供的缓冲区大小不足以容纳窗口的全部文本,函数只会复制前
nMaxCount - 1个字符,并在末尾添加一个空字符\0。返回值会反映实际复制的字符数(不包括\0),而不是窗口文本的总长度。
- 类型:
返回值
函数返回一个 int 类型的值,它表示实际复制到缓冲区中的字符数量(不包括结尾的空字符 \0)。
- 返回值 > 0: 成功,返回复制的字符数。
- 返回值 == 0: 有两种可能:
- 成功,但窗口的标题为空。
- 失败,句柄
hWnd无效或指向的窗口没有标题。
- 返回值 == 0 且
GetLastError()返回非零值: 明确表示操作失败,可以使用GetLastError()函数获取具体的错误代码。
使用示例
下面我们通过几个例子来演示如何使用 GetWindowText。
示例 1: 获取自己创建的窗口标题
这是一个最简单的例子,创建一个窗口并显示其标题。
#include <windows.h>
#include <stdio.h>
// 窗口过程函数
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) {
switch (message) {
case WM_PAINT: {
PAINTSTRUCT ps;
HDC hdc = BeginPaint(hWnd, &ps);
// 获取窗口标题
char title[256];
int length = GetWindowText(hWnd, title, sizeof(title));
// 在窗口上绘制标题文本
TextOut(hdc, 10, 10, title, length);
EndPaint(hWnd, &ps);
}
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
return 0;
}
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) {
const char CLASS_NAME[] = "MyWindowClass";
// 注册窗口类
WNDCLASS wc = { };
wc.lpfnWndProc = WndProc;
wc.hInstance = hInstance;
wc.lpszClassName = CLASS_NAME;
RegisterClass(&wc);
// 创建窗口
HWND hWnd = CreateWindowEx(
0, // Optional window styles.
CLASS_NAME, // Window class
"你好,世界!", // Window text (标题)
WS_OVERLAPPEDWINDOW, // Window style
// Size and position
CW_USEDEFAULT, CW_USEDEFAULT, 800, 600,
NULL, // Parent window
NULL, // Menu
hInstance, // Instance handle
NULL // Additional application data
);
if (hWnd == NULL) {
return 0;
}
ShowWindow(hWnd, nCmdShow);
// 消息循环
MSG msg = { };
while (GetMessage(&msg, NULL, 0, 0)) {
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return (int)msg.wParam;
}
示例 2: 获取其他程序的窗口标题
这个例子会查找一个记事本(Notepad)窗口,并打印出它的标题。

(图片来源网络,侵删)
#include <windows.h>
#include <stdio.h>
int main() {
// 1. 查找窗口句柄
// FindWindow的第一个参数是窗口类名,第二个是窗口标题。
// 记事本的窗口类名通常是 "Notepad"。
HWND hNotepadWindow = FindWindow("Notepad", NULL);
if (hNotepadWindow == NULL) {
printf("未找到记事本窗口,请先打开一个记事本,\n");
return 1;
}
// 2. 准备一个缓冲区来接收标题
char windowTitle[256];
// 3. 调用 GetWindowText
// 注意:sizeof(buffer) 会计算缓冲区总大小(包括'\0'),
// 这是我们希望函数能复制的最大字符数。
int copiedChars = GetWindowText(hNotepadWindow, windowTitle, sizeof(windowTitle));
// 4. 检查结果
if (copiedChars > 0) {
printf("成功获取记事本窗口标题: \"%s\"\n", windowTitle);
printf("实际复制了 %d 个字符,\n", copiedChars);
} else {
printf("获取窗口标题失败或窗口标题为空,\n");
// 可以调用 GetLastError() 获取更详细的错误信息
DWORD error = GetLastError();
if (error != 0) {
printf("GetLastError 返回错误码: %lu\n", error);
}
}
return 0;
}
重要注意事项
-
缓冲区大小: 这是
GetWindowText最容易出错的地方。永远要确保你的缓冲区足够大,一个常见的做法是定义一个足够大的数组,如char buffer[1024];,然后将sizeof(buffer)作为nMaxCount传入。 -
字符编码:
- 在 Windows 95/98/ME 和 Windows NT/2000/XP 中,
LPTSTR可能是char*(ANSI) 或wchar_t*(Unicode),取决于你项目是编译为 MBCS 还是 Unicode。 - 在现代 Windows (Vista 及以后) 中,强烈推荐使用 Unicode 版本。
GetWindowText实际上是GetWindowTextA(ANSI) 和GetWindowTextW(Unicode) 的宏,当你包含windows.h并定义UNICODE时,GetWindowText会被解析为GetWindowTextW,它使用wchar_t类型的缓冲区。 - 如果你想处理中文、日文等非英文字符,必须使用 Unicode 版本。
GetWindowTextW会返回 UTF-16 编码的宽字符字符串。
- 在 Windows 95/98/ME 和 Windows NT/2000/XP 中,
-
获取文本长度: 如果你不知道窗口标题有多长,可以先调用一次
GetWindowText,传入一个NULL指针和0作为参数,在这种情况下,函数会不复制文本,但会返回窗口标题的所需缓冲区大小(包括\0),然后你可以根据这个值来分配内存,再调用一次来获取文本。// 获取所需缓冲区大小 int length = GetWindowText(hWnd, NULL, 0); if (length > 0) { // 分配内存 (length 包含了 '\0') wchar_t* buffer = (wchar_t*)malloc(length * sizeof(wchar_t)); if (buffer) { // 再次调用获取文本 GetWindowTextW(hWnd, buffer, length); wprintf(L"窗口标题: %s\n", buffer); free(buffer); } }
GetWindowText 是一个基础但功能强大的 Windows API 函数,用于从窗口或控件中提取文本,使用它的关键点在于:
- 正确获取目标窗口的句柄 (
hWnd)。 - 提供一个足够大的、已分配好的缓冲区 (
lpString)。 - 正确指定缓冲区的大小 (
nMaxCount) 以避免溢出。 - 处理返回值以判断操作是否成功。
- 在现代开发中,优先使用 Unicode 版本 (
GetWindowTextW) 以确保对国际字符的良好支持。
