我正在尝试创建一个 Visual Tree Explorer 应用程序(如 Snoop、Mole),它应该自动识别所有桌面应用程序并检测它是否是 WPF 应用程序。或不。我正在尝试在 WPF 中执行此操作。有没有办法让所有 WPF 打开的应用程序。任何特殊的 API,或系统 dll 中的 native 函数等。
问候,
贾瓦哈尔
最佳答案
我认为您可以遍历所有进程的列表,对于那些有窗口的进程,检查窗口类名是否以 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 窗口,而不是肯定的,因此必须进行广泛的错误检查。
关于wpf - 使用 WPF 获取所有打开的桌面应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4545111/