我可以使用下面的代码获取进程名称,但是如何获得最终用户熟悉的应用程序名称,而不是获取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
{
}
}
答案 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;开始菜单文件夹。
此代码未经过彻底测试或防范角落案件。使用风险自负。