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

Den*_*sel 10 reflection wpf snoop

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

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

在工作中我正在编写一个Coded UI Testing-Framework,如果我可以访问应用程序的对象结构,那将是非常棒的,因为这样我不仅可以断言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;
Run Code Online (Sandbox Code Playgroud)

这对我来说已经是一个很大的帮助,但是了解Snoop如何将自己注入另一个进程也很有趣.

Kes*_*ess 4

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

因此,在 UI 测试中,抓住主窗口并遍历其可视化树以查找所需的任何元素,然后对该元素执行所需的任何验证或操作。

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

Window window = (Window)System.Windows.Interop.HwndSource.FromHwnd(process.MainWindowHandle).RootVisual;
Run Code Online (Sandbox Code Playgroud)

  • 这根本无法解释 Snoop “最初”如何访问外部进程的 WPF 可视化树。它也没有解释 Snoop 如何检查对象实例,例如 DataContext,它不是 UI 元素,也不属于 Visual Tree。 (3认同)