我正在开发一个应用程序来监视Windows机器上运行的内容。如果在自动化过程中弹出某些对话框,它将用于引发警报。我正在使用Windows API来获取现有窗口的类名,这很好。但是,如果这些是.NET应用程序,那么我会得到类似“WindowsForms10.Window.8.app.0.39cfeeb”的内容而不是.NET类名,更糟糕的是,类名在执行之间并不是一成不变的。
当只提供一个Windows句柄时,有没有办法获取.NET类名?
答案 0 :(得分:3)
是的,这不行。桌面会话中的每个唯一窗口都必须具有唯一的Windows“类名”,该字符串传递给RegisterClassEx()winapi函数并在CreateWindowEx()中使用。 Winforms自动生成这些名称,因此它有责任确保它生成的名称不会与其他进程和appdomains中的窗口名称冲突。这就是为什么你看到这些奇怪的名字,最重要的部分是你的例子中的最后一点39cfeeb,AppDomain.GetHashCode()返回的值。您无法从外部进程检索该哈希代码。
您需要一种根本不同的方法,不依赖于易于获得的类名。查看Managed Spy code,它支持在外部Winforms进程上使用Reflection。隔离它使用的DLL注入代码技术,这样你就可以在自己的代码中自己使用它来完成一些工作。
这也是您从流程中获取.NET类名的唯一方法,在使用UI自动化时您从未真正关心过。
答案 1 :(得分:2)
我不这么认为。 Windows中窗口的“类名”与.NET类无关。在Windows中,可以注册窗口类,但这基本上只是确定窗口样式的标志集合。
.NET似乎为每个Form注册了这样一个窗口类,但似乎随机命名。这解释了类名不是常数的事实。