【问题标题】:GetWindowText return empty string for another processGetWindowText 为另一个进程返回空字符串
【发布时间】:2019-01-18 05:28:26
【问题描述】:

我正在尝试在循环中获取其他 MFC 应用程序的窗口文本(我正在使用 ProcessId 获取其他进程的句柄)。但是,有时我会变得空白。当我在其他 MFC 应用程序上执行某些活动时,有时会得到窗口文本,有时它会消失。我尝试使用 GetLastError 但它在 GetWindowText 返回空白时返回 0。那么有什么方法可以找出我的应用程序或其他 MFC 应用程序中可能存在的错误?

示例代码:

 HWND hWnd = GetProcessHWND(<processid>); //This is function created to get 
    hWnd using process id
    if (hWnd)
   {
       CWnd *pWnd = CWnd::FromHandle(hWnd);
       while (pWnd->GetParent())
       {
          pWnd = pWnd->GetParent();
       }
       TCHAR chTitle[MAX_PATH];
       pWnd->GetWindowText(chTitle, MAX_PATH);
   }

【问题讨论】:

标签: c++ windows winapi mfc


【解决方案1】:

您的程序是以普通用户权限运行还是以完全管理员权限运行?如果您无法从以完全管理员权限运行的程序中获取窗口文本,这可能是因为 Microsoft 在 Windows Vista 中引入了“User Interface Privilege Isolation (UIPI) message filter”:默认情况下,进程无法将窗口消息发送到另一个进程更高的完整性级别。

如果是这种情况,并且您的程序源代码没有给出有效结果,您可以使用 API ChangeWindowMessageFilterEx(Windows 7 / Server 2008 R2 及更高版本)来允许选中或 ChangeWindowMessageFilter(Windows Vista / Server 2008)允许来自非特权程序的所有消息到达以更高特权运行的进程。

【讨论】:

  • 当 GetWindowText 总是返回空白时,这可能会出现问题,但在我的情况下,有时我得到有效的 GetWindowText,有时在两个应用程序运行期间没有。所以我认为有时任何应用程序都会在某些情况下运行,因为它没有获取或发送窗口文本。
  • 我想尝试另一种方法来获取其他应用程序会定期向我的应用程序发送窗口文本的窗口文本。现在您的上述答案将出现在图片中。我的应用程序(比如 A)以管理员身份运行,而其他应用程序(比如 B)正常运行。现在 B 将使用 PostMessage 定期向 A 发送其窗口文本,但现在 A 没有从 B 接收消息。这些 API ChangeWindowMessageFilterEx 或 ChangeWindowMessageFilter 将被添加到 A 或 B?其实我都试过了,但结果还是一样的。一个例子会很有帮助。
猜你喜欢
  • 1970-01-01
  • 2013-09-13
  • 1970-01-01
  • 2019-10-29
  • 2011-02-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多