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

时间:2010-12-28 09:49:12

标签: wpf

我正在尝试创建一个Visual Tree Explorer应用程序(如Snoop,Mole),它应该自动识别所有桌面应用程序并检测它是否是WPF应用程序。或不。我想在WPF中这样做。有没有办法让所有WPF打开的应用程序。任何特殊的API,或系统dll中的本机函数等。

此致

Jawahar

1 个答案:

答案 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窗口,不能确定它,所以错误检查必须是广泛的。

相关问题