我在全局CBT挂钩过程中使用以下代码:

TCHAR title[256];
int getT = GetWindowText(hWnd, title, 256);
if (getT == 0) {
    int err = GetLastError();
    logFile << "Error GetWindowText(): " << err << endl;
} else {
    logFile << "getT = " << getT << endl;
}

问题在于,对于某些窗口,GetWindowText()函数可以正常工作,并且我可以获取正确的窗口标题,但是对于其他一些窗口,它返回0且我得到一个空字符串。 GetLastError()返回183,即ERROR_ALREADY_EXISTS:



错误不是随机的:我总是在同一个应用程序打开的相同类型的窗口中得到它,但是对于所有其他窗口,它似乎都可以正常工作。

最佳答案

您可能无权从Windows Vista及更高版本上的某些窗口检索文本。

我的猜测是,当您打印“Error GetWindowText():”时,ERROR_ALREADY_EXISTS来自您的日志文件。在执行其他任何操作之前,您应该先获取错误代码。

另一种可能性是窗口从其WM_GETTEXT处理程序返回0,而没有设置最后一个错误。如GetWindowText文档所述,如果您在属于同一进程的窗口上调用它,它将通过发送此消息来检索文本。由于您是从挂钩中调用函数,因此可能处于同一过程中。

07-24 18:25