wpf - Snoop 使用什么技术来检查 WPF 应用程序

标签 wpf reflection snoop

spy 实用程序 Snoop 使用一些强大的技术(可能是某种反射)来检查正在运行的 WPF 应用程序。最有趣的是,Snnop 能够读出整个对象结构。

前几天我下载了Snoop源代码,花了一些时间研究内部行为。不幸的是,我还不知道 Snoop 是如何做这些事情的,所以我希望任何人都可以帮助我。

在工作中,我目前正在编写一个编码的 UI 测试框架,如果我能够访问应用程序的对象结构,那就太棒了,因为这不仅可以让我断言 UI 状态。

更新:

这是所需的代码:

string filePath = "WpfApp.exe";
AppDomain appDomain = AppDomain.CurrentDomain;
byte[] bytes = System.IO.File.ReadAllBytes(filePath);
Assembly ass = appDomain.Load(bytes);
ass.EntryPoint.Invoke(null, new object[] { });
IntPtr handle = Process.GetCurrentProcess().MainWindowHandle;
Window w = System.Windows.Interop.HwndSource.FromHwnd(handle).RootVisual as Window;

这对我来说已经是一个很大的帮助,但发现 Snoop 如何将自己注入(inject)另一个进程也很有趣。

最佳答案

您可以通过使用 WPF VisualTreeHelper 和/或 LogicalTreeHelper 来完成 Snoop 的工作。一旦你掌握了任何视觉元素,你几乎可以遍历它的整个视觉树来查看它包含的所有元素。可视化树助手 here

因此,在您的 UI 测试中,捕获主窗口并遍历其可视化树以找到您想要的任何元素,然后对该元素执行您想要的任何验证或操作。

此外,您可以使用 System.Diagnostics.Process.MainWindowHandle 从现有进程获取窗口句柄,然后使用窗口句柄创建 wpf 窗口。它已经有一段时间了,所以我不记得没有做更多研究的细节。下面的代码可能会有所帮助:

Window window = (Window)System.Windows.Interop.HwndSource.FromHwnd(process.MainWindowHandle).RootVisual;

关于wpf - Snoop 使用什么技术来检查 WPF 应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24045183/

相关文章:

WPF RadioButton 已知问题 : why the old property value seems still binding after property changed

c# - WPF - 将背景颜色绑定(bind)到三个 slider ?

wpf - 为什么我的 XmlSerializer 出现错误?

language-agnostic - 用于协议(protocol)开发/调试的 RS-232 串行监听工具

java - Android 上的 MediaPlayer.snoop

c# - 如何为控制台和 WPF .NET 应用程序的 PythonNET 设置 Runtime.PythonDLL(PIP 安装)

c# - 有没有办法通过 .NET 中的反射调用显式实现的方法/属性?

c++ - 使用 Visual Studio .ncb 文件进行反射

powershell - 构造一个自定义对象,其属性将按定义顺序枚举

wpf - WPF 应用程序的 Snoop 实用程序不工作 - 它支持 WPF 4 吗?