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

标签 wpf

我正在尝试创建一个 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/

相关文章:

wpf - 在 TextBlock 中隐藏 <Run/> 标签 - WPF

c# - 当用户在 wpf 中将鼠标悬停在它上面时,我如何突出显示它?

c# - 如何在像 Office 2010 这样的 WPF 应用程序中对 Aero 玻璃进行渐变淡入淡出?

c# - WPF + 在 TextBlock 中显示 bat 文件的输出

asp.net - WPF 浏览器应用程序可以用作 ASP.NET 的替代品吗?

c# - WPF MVVM : EventTrigger is not working inside CheckBox

wpf - 将 ListBox 中的多个项目复制到剪贴板

.NET 4.0 完整/客户端配置文件;有人关心吗?

c# - WPF 文本框和空格字符换行

wpf - 更改 WPF ValidatesOnException 绑定(bind)中的消息(或异常)