c# - 如何使用 C# 获取正在运行的应用程序的开始菜单名称?

标签 c#

我可以使用下面的代码获取进程名称,但如何获取最终用户熟悉的应用程序名称,即我想显示开始菜单中所示的 Word 2013,而不是获取 WinWord。

foreach (var p in Process.GetProcesses())
{
   try
   {
     if (!String.IsNullOrEmpty(p.MainWindowTitle))
       {
         Console.WriteLine(String.Format("Process Name: " + p.ProcessName.ToString()));
       }
     }
   catch
   {
   }
}

最佳答案

我在可执行文件描述中找不到“开始菜单”名称。例如,在文件资源管理器中查看可执行文件详细信息时,文件 WINWORD.EXE 的产品名称为“Microsoft Office 2016”,文件描述为“Microsoft Word”。

这让我认为,为了找到“开始菜单”名称,我们实际上应该查看开始菜单。我们可以通过enumerating all the lnk files来做到这一点在其中,并保持“开始菜单”名称(这只是 lnk 文件的文件名)和 executable it links to 之间的映射。 .

一旦我们有了这个映射,我们就可以查询它以获取从 GetProcesses() 获取的进程。

示例代码(添加 Windows 脚本宿主对象模型作为 COM 引用):

public static string GetShortcutTargetFile(string shortcutFilename)
{
    if (File.Exists(shortcutFilename))
    {
        var shell = new WshShell();
        var link = (IWshShortcut)shell.CreateShortcut(shortcutFilename);

        return link.TargetPath;
    }

    return string.Empty;
}

public static Dictionary<string, string> CreateDictionary(string path)
{
    var dictionary = new Dictionary<string, string>();

    foreach (var filePath in Directory.EnumerateFiles(path, "*.lnk", SearchOption.AllDirectories))
    {
        var lnkPath = GetShortcutTargetFile(filePath);
        if (lnkPath.Length > 0 && !dictionary.ContainsKey(lnkPath))
        {
            dictionary.Add(lnkPath, Path.GetFileNameWithoutExtension(filePath));
        }
    }

    return dictionary;
}

static void Main()
{
    var startMenuLocation = Environment.GetFolderPath(Environment.SpecialFolder.CommonStartMenu);
    var dictionary = CreateDictionary(startMenuLocation);

    foreach (var p in Process.GetProcesses())
    {
        try
        {
            if (!string.IsNullOrEmpty(p.MainWindowTitle))
            {
                var pair = dictionary.FirstOrDefault(entry => entry.Key.Contains(p.ProcessName));
                var prettyName = pair.Value;
                Console.WriteLine(string.Format("Process Name: " + prettyName));
            }
        }
        catch
        {
        }
    }
}

正如 ReneA 在评论中指出的那样,代码仅枚举共享开始菜单文件夹。人们可能还想枚举用户的开始菜单文件夹。

此代码未经过彻底测试或针对极端情况进行防护。使用风险由您自行承担。

关于c# - 如何使用 C# 获取正在运行的应用程序的开始菜单名称?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41661269/

相关文章:

c# - asp.net:如何将两个模型组合在一起才能创建父实体及其所有子实体?

c# - 在数据库级别授权数据访问

C# - Json 反序列化具有子属性的对象

c# - 多线程上的 WPF UI?

c# - 单元测试的模型验证仅适用于字符串

c# - MSMQ 接收时间

c# - EF Core 3.1 调用 context.Add() 在使用 SQL 中的序列的模型上抛出 "nullable object must have a value"

c# - 我应该安装哪个版本的 Entity Framework ?

c# - 将隐含为派生程度较低的类型的对象放入派生程度较高的类型的列表中

javascript - 三个按钮从 Controller 调用相同的操作方法 - 确定调用哪一个方法