我正在尝试创建一个Visual Tree Explorer应用程序(如Snoop,Mole),它应该自动识别所有桌面应用程序并检测它是否是WPF应用程序。或不。我想在WPF中这样做。有没有办法让所有WPF打开的应用程序。任何特殊的API,或系统dll中的本机函数等。
此致
Jawahar
答案 0 :(得分:3)
我认为你可以遍历所有进程的列表,对于那些有窗口的进程,检查窗口类名是否以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窗口,不能确定它,所以错误检查必须是广泛的。