使用WPF获取所有打开的桌面应用程序

3
我正在尝试创建一个可视化树浏览器应用程序(类似于Snoop、Mole),它应该自动识别所有桌面应用程序并检测它是否是WPF应用程序。我正在使用WPF尝试完成这个任务。有没有什么方法可以获取所有打开的WPF应用程序?是否有特殊的API或系统dll中的本地函数等。
谢谢,
Jawahar
1个回答

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窗口而不是确定它,因此错误检查必须非常全面。


1
哇,小心期望你“注意到”的事情在所有配置和未来版本中都是稳定和一致的!除非你在某个地方看到了这个文档,否则我强烈警告你不要带着任何期望使用它。更不用说可能会有其他进程在具有类名“HwndWrapper”的系统上运行了。 - Cody Gray
这就是我回答中最后一句话的目的。 - Andrei Pana

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接