我正在尝试创建一个可视化树浏览器应用程序(类似于Snoop、Mole),它应该自动识别所有桌面应用程序并检测它是否是WPF应用程序。我正在使用WPF尝试完成这个任务。有没有什么方法可以获取所有打开的WPF应用程序?是否有特殊的API或系统dll中的本地函数等。
谢谢,
Jawahar
谢谢,
Jawahar
我认为你可以遍历所有进程的列表,对于那些有窗口的进程,检查窗口类名是否以HwndWrapper开头(我注意到WPF窗口的类名是这样的:HwndWrapper [DefaultDomain;; 2e60e21a-8752-4daf-820b-aed289668930])
代码应该像这样:
Process[] procs = Process.GetProcesses();
foreach(Process p in procs)
{
if (p.MainWindowHandle != null)
{
Console.WriteLine(p.MainWindowTitle);
StringBuilder sb = new StringBuilder(257);
RealGetWindowClass(p.MainWindowHandle, sb, 256);
Console.WriteLine(sb.ToString());
if(sb.ToString().StartsWith("HwndWrapper"))
{
Console.WriteLine("WPF window");
}
}
}
[DllImport("user32.dll")]
static extern uint RealGetWindowClass(IntPtr hwnd, [Out] StringBuilder pszType, uint cchType);
根据您的情况,可能需要进行一些调整。当处理这样的窗口时,应该假设它是一个WPF窗口而不是确定它,因此错误检查必须非常全面。