C#、C++、WinAPI - 从另一个进程获取窗口数

Posted

技术标签:

【中文标题】C#、C++、WinAPI - 从另一个进程获取窗口数【英文标题】:C#, C++ , WinAPI - Get Number of windows from another process 【发布时间】:2011-05-30 10:35:37 【问题描述】:

可以用 C# 或 C++ 或 WinAPI 回答(我知道如何 pInvoke)。

我想要达到的目标。 我想获取另一个应用程序打开的窗口数量。 例如我有聊天应用程序。我想获取窗口数量,因为我不想检测是否有人向我发送消息(新传入消息 = 多一个窗口)。

简而言之。 如何获取另一个进程打开的窗口数。

【问题讨论】:

一个涉及 WinAPI 的答案!= C++ 中的一个答案。 @DeadMG 这可以在 WinAPI 中。我的错。 “新传入消息 = 多一个窗口”:如果目标聊天应用程序更改其 UI 以使所有消息只使用一个窗口,这将适得其反。如果您从不更改您的聊天应用程序可能没问题,但即便如此,它也确实是个杂牌。 @In silico 这只是示例。我想将它用于其他任务。但在那个聊天示例中更容易解释。 【参考方案1】:

如果您有其他应用程序的进程 ID,这是一种可能的 Windows API 方式:

使用 EnumWindows 函数枚举所有***窗口,在回调函数中使用 GetWindowThreadProcessId 来测试属于您给定进程的主窗口。从匹配的主窗口中,您可以继续使用 EnumChildWindows 枚举其所有子窗口。

【讨论】:

【参考方案2】:

首先,您需要***窗口的句柄。如果您知道窗口的名称,FindWindow() 会检索它。

第二步已经在 SO 上解释过很多次了:

.NET (C#): Getting child windows when you only have a process handle or PID?

How can I get the child windows of a window given its HWND?

【讨论】:

以上是关于C#、C++、WinAPI - 从另一个进程获取窗口数的主要内容,如果未能解决你的问题,请参考以下文章

C#实现一个弹窗监控小程序

winApi使用c++创建进程

简单的匿名管道 - 您使用啥包装器模型? (WinAPI, C++)

如何在纯 C++ 中高效快速地清理我的 GDI 对象 - winapi(不是 .net,c#)?

如何获取具有可见窗口的任何进程的名称 - WinAPI?

如何从另一个进程捕获退出代码[重复]