3

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

有没有办法在仅提供 Windows 句柄时获取 .NET 类名?

4

2 回答 2

3

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

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

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

于 2012-06-01T13:21:39.680 回答
2

我不这么认为。Windows 中窗口的“类名”与 .NET 类无关。在 Windows 中,可以注册窗口类,但这基本上只是确定窗口样式的标志的集合。

.NET 似乎为每个窗体注册了这样一个窗口类,但似乎是随机命名的。这就解释了类名不是常量的事实。

于 2012-06-01T12:46:04.517 回答