c# - 来自窗口句柄的 .net 类名

标签 c# .net winapi

我正在开发一个应用程序来监控 Windows 机器上正在运行的内容。如果在自动化过程中弹出某些对话框,它将用于发出警报。我正在使用 Windows API 获取现有窗口的类名,效果很好。但是,如果这些是 .NET 应用程序,那么我得到的不是 .NET 类名,而是类似“WindowsForms10.Window.8.app.0.39cfeeb”的内容,更糟糕的是,类名在执行之间不是恒定的。

有没有一种方法可以在仅提供 Windows 句柄时获取 .NET 类名?

最佳答案

是的,这行不通。桌面 session 中的每个唯一窗口都必须有一个唯一的 Windows“类名”,该字符串传递给 RegisterClassEx() winapi 函数并在 CreateWindowEx() 中使用。 Winforms 自动生成这些名称,因此它有责任确保它生成的名称不会与其他进程和应用程序域中的窗口名称冲突。这就是为什么您会看到这些奇怪的名称,最重要的部分是最后一位,在您的示例中为 39cfeeb,AppDomain.GetHashCode() 返回的值。您无法从外部进程检索该哈希码。

您需要一种根本不同的方法,它不依赖于容易获得的类名。看Managed Spy code ,它支持在外部 Winforms 进程上使用反射。隔离它使用的 DLL 注入(inject)代码技术以便您可以在自己的代码中使用它需要一些工作。

这也是您从进程中获取 .NET 类名的唯一方法,否则在使用 UI 自动化时您永远不会真正关心这一点。

关于c# - 来自窗口句柄的 .net 类名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10850485/

相关文章:

c# - 如何指示 Controller 中的方法不是操作方法?

c# - 从 C# 调用 Win32 是否有更轻松的方法?

.net - 部署在本地 IIS 中时,azure 消息传递服务未接收消息

c - 将数据存储在自定义索引: GWLP_USERDATA_EX?中

c# - 在托管代码中使用 win32

c# - LINQ 上的简单查询

c# - 如何从其文件夹外执行 .exe

c# - 在读/写 Access 数据库时获得最少锁定时间的最佳方法

asp.net - ASP :QueryStringParameter and empty query string parameter

c++ - 阅读控制台缓冲区/输出 C++