GetWindowText 为另一个进程返回空字符串
Posted
技术标签:
【中文标题】GetWindowText 为另一个进程返回空字符串【英文标题】:GetWindowText return empty string for another process 【发布时间】: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);
【问题讨论】:
编辑您的问题以包含minimal reproducible example。 请从您的代码中提取minimal reproducible example,没有它,您的问题还没有准备好。此外,您应该在再次发布时添加winapi。作为新用户,也可以使用tour 并阅读How to Ask。 我也这么认为,但我在这里读到 (blogs.msdn.microsoft.com/oldnewthing/20030821-00/?p=42833) GetWindowText 不会为其他进程发送 WM_GETTEXT。但是当尝试发送注册消息以获取窗口文本时,但我发现当 GetWindowText 当时返回空白时,该注册消息也无法到达其他应用程序。那么可能是什么原因呢?主线程挂了? 【参考方案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?其实我都试过了,但结果还是一样的。一个例子会很有帮助。以上是关于GetWindowText 为另一个进程返回空字符串的主要内容,如果未能解决你的问题,请参考以下文章
对于 C#,在调用 Win32 函数(如 GetWindowText)时使用“字符串”而不是“字符串生成器”是不是有不利之处?