我可以使用下面的代码获取进程名称,但如何获取最终用户熟悉的应用程序名称,即我想显示开始菜单中所示的 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/