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

时间:2017-01-15 12:49:03

标签: c#

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

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

1 个答案:

答案 0 :(得分:2)

我无法找到"开始菜单"在可执行文件描述中的任何位置命名例如,文件WINWORD.EXE具有产品名称" Microsoft Office 2016"和文件描述" Microsoft Word",查看文件资源管理器中的可执行文件详细信息。

这让我觉得为了找到"开始菜单"名字,我们应该看看开始菜单。我们可以通过enumerating all the lnk files在其中进行,并在"开始菜单"之间保持映射。 name(只是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在评论中指出的那样,代码只列举了共享的开始菜单文件夹。人们可能想要枚举用户&#39;开始菜单文件夹。

此代码未经过彻底测试或防范角落案件。使用风险自负。