【问题标题】:GetWindowText() returning empty string and strange errorGetWindowText() 返回空字符串和奇怪的错误
【发布时间】:2011-08-15 09:14:06
【问题描述】:

我在全局 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:

当文件已存在时无法创建该文件。

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

【问题讨论】:

  • 您是否尝试在另一个应用程序中检索编辑控件的文本?
  • 不,我正在尝试获取窗口的标题
  • 这是我们系统上可以测试的窗口吗?
  • 在调用GetWindowText之前尝试调用SetLastError(666)。如果您将开始返回 666,则可能意味着 GetWindowText 被一个 api 钩子拦截,该钩子阻止读取某个窗口并且不会打扰设置正确的错误代码。
  • 也许他们的表格窗口是一个编辑控件,只是修改到足以显示为常规窗口。或者它可能只是在模仿一个真实的窗口,根本不使用 SetWindowText()。 Spy++ 告诉你关于窗口的什么?

标签: c++ winapi


【解决方案1】:

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

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

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

【讨论】:

  • 在写入文件之前编辑了代码以检索错误,它仍然返回相同的奇怪错误。另外,我在 Win XP 上。
  • 你是从一个钩子里调用这个的,对吧?如果窗口在同一个进程中,则通过发送 WM_GETTEXT 消息来检索窗口文本,该消息可能返回 0 而不设置最后一个错误。如果您将 GetLastError 调用 before GetWindowText,GetLastError 会返回 183 吗?
猜你喜欢
  • 1970-01-01
  • 2014-02-28
  • 2019-11-14
  • 2012-11-02
  • 1970-01-01
  • 1970-01-01
  • 2015-11-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多