我正在开发一个应用程序来监视 Windows 计算机上运行的内容。如果在自动化过程中弹出某些对话框,它将用于发出警报。我正在使用 Windows API 来获取现有窗口的类名,效果很好。但是,如果这些是 .NET 应用程序,那么我得到的不是 .NET 类名,而是类似“WindowsForms10.Window.8.app.0.39cfeeb”的内容,更糟糕的是,类名在执行之间不是恒定的。
有没有办法在仅提供 Windows 句柄时获取 .NET 类名?
是的,这是行不通的。桌面会话中的每个唯一窗口都必须有一个唯一的 Windows“类名”,该字符串传递给 RegisterClassEx() winapi 函数并在 CreateWindowEx() 中使用。 Winforms 自动生成这些名称,因此它有责任确保它生成的名称不会与其他进程和应用程序域中的窗口名称发生冲突。这就是为什么您会看到这些奇怪的名称,最重要的部分是最后一位,在您的示例中为 39cfeeb,即 AppDomain.GetHashCode() 返回的值。您无法从外部进程检索该哈希代码。
您将需要一种根本不同的方法,该方法不依赖于容易获得的类名。看着那(这托管间谍代码 http://msdn.microsoft.com/en-us/magazine/cc163617.aspx,它支持在外部 Winforms 进程上使用 Reflection。隔离它使用的 DLL 注入代码技术以便您可以在自己的代码中使用它需要一些工作。
这也是您从进程中获取 .NET 类名的唯一方法,否则您在使用 UI 自动化时永远不会真正关心这一点。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)