我正在开发一个应用程序来监控 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/