C# 窗口句柄中的.net类名

C# 窗口句柄中的.net类名,c#,.net,winapi,C#,.net,Winapi,我正在开发一个应用程序,它可以监视windows计算机上运行的内容。如果在自动化过程中出现某些对话框,它将用于发出警报。我正在使用WindowsAPI获取现有windows的类名,这很好。但是,如果这些是.NET应用程序,那么我得到的不是.NET类名,而是类似于“WindowsForms10.Window.8.app.0.39cfeeb”,更糟糕的是,在执行之间类名不是恒定的 只有windows句柄才能获得.NET类名吗?我不这么认为。Windows中窗口的“类名”与.NET类无关。在Windo

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

只有windows句柄才能获得.NET类名吗?

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


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

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

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


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

@abatishchev您的编辑使问题的标题意义大大降低,因为我感兴趣的显然是.NET类名。大多数开发人员都知道如何从窗口句柄获取类名。谢谢你,Hans,ManagedSpy真是太棒了!我认为唯一窗口名标准只适用于托管代码?混乱陈述。提前谢谢。