GetWindowTextW: 将指定窗口标题栏的文本(如果有)复制到缓冲区,如果指定的窗口是控件,则复制控件的文本。
注意:GetWindowTextW无法检索另一个应用程序中的控件文本
函数原型:
int GetWindowTextW(
HWND hWnd,
LPWSTR lpString,
int nMaxCount
);
hWnd: 文本的窗口或控件的句柄
lpString: 将要接受文本的缓冲区,如果字符串与缓冲区一样长,则字符串将被截断并以NULL字符终止
nMaxCount: 要复制到缓冲区的最大字符数,包括空字符。如果文本超出此限制,则会被截断
备注:
如果目标窗口是由当前进程所拥有,GetWindowText函数导致WM_GETTEXT消息被发送到指定的窗口或控制。如果目标窗口由另一个进程拥有并且具有标题,则GetWindowText将检索窗口标题文本。如果窗口没有标题,则返回值为空字符串。此行为是设计使然。如果拥有目标窗口的进程没有响应,它允许应用程序调用GetWindowText而不会无响应。但是,如果目标窗口没有响应并且它属于调用应用程序,则GetWindowText将导致调用应用程序无响应。
要在另一个进程中检索控件的文本,请直接发送WM_GETTEXT消息,而不是调用GetWindowText
之所以在标题强调使用GetWindowTextW,是因为在检索字符时,比如中文,是宽字节,这样在复制字符到缓冲区不会出现乱码的情况,所以最好在创建完环境后,将默认的多字节改成Unicode环境。
更为深奥的解释:https://devblogs.microsoft.com/oldnewthing/20030821-00/?p=42833
一个最小的代码示例:
int textLen = GetWindowTextLengthW(control_hwnd);
wchar_t* buffer = new wchar_t[textLen + 1];
GetWindowTextW(control_hwnd, buffer, textLen + 1);