【问题标题】:.net class name from a window handle来自窗口句柄的 .net 类名
【发布时间】:2012-06-06 16:58:01
【问题描述】:

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

有没有办法在只显示 Windows 句柄时获取 .NET 类名?

【问题讨论】:

  • @abatishchev 您的编辑使问题的标题意义不大,因为它明确是我感兴趣的 .NET 类名。大多数开发人员都知道如何从窗口句柄'

标签: c# .net winapi


【解决方案1】:

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

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

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

【讨论】:

  • 谢谢汉斯,托管间谍太棒了!
  • 我认为唯一的窗口名称标准仅适用于托管代码?困惑表示here。提前致谢。
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 2011-02-26
    • 1970-01-01
    • 2010-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-02
    • 2013-11-11
    • 2017-10-02
    相关资源
    最近更新 更多