窗口句柄中的.net类名

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

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

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

您需要一种根本不同的方法,而不依赖于易于获得的类名。 查看Managed Spy代码 ,它支持在外部Winforms进程上使用Reflection。 隔离它使用的DLL注入代码技术,这样你就可以在自己的代码中自己使用它来完成一些工作。

这也是你从过程中获得.NET类名的唯一方法,在使用UI自动化时你从未真正关心过这个问题。

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

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