2012-06-01 78 views
3

我正在研究监视Windows机器上运行的应用程序。如果在自动化过程中弹出某些对话框,它将用于引发警报。我正在使用Windows API来获取现有窗口的类名,这很好。但是,如果这些应用程序是.NET应用程序,而不是.NET类名称,则会得到类似于“WindowsForms10.Window.8.app.0.39cfeeb”的内容,并且更糟糕的是,类名称在执行之间并不是恒定的。.net窗口句柄的类名

当只有一个窗口句柄时,有没有办法获得.NET类名?

+2

@abatishchev您的编辑使得问题的标题远没有意义,因为它明确指出了我感兴趣的.NET类名。大多数开发人员知道如何从窗口句柄中获取'类名' –

回答

3

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

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

此外,您还可以从流程中获取.NET类名称的唯一方法,这是您在使用UI自动化时从未真正关心的内容。

+0

你Hans,Managed Spy很棒! –

+0

我认为独特的窗口名称标准仅适用于托管代码?混乱说明[这里](http://stackoverflow.com/questions/17022163/native-window-hierarchy-and-class-names-in-c-sharp)。提前致谢。 –

2

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

.NET似乎为每个窗体注册了这样一个窗口类,但似乎随机命名它。这就解释了类名不固定的事实。