我已经创建了一个应用程序来扩展,例如“.ext”我在Windows“regedit”中添加了必需条目,以便在我打开它时执行“.ext”。现在,如果我选择了多个files.ext,我会选择它;然后我的应用程序的倍数实例出现。
我的应用程序收到一个String[] args
作为参数,所以如果我打开一个file.ext然后我收到args[0]
中的文件路径,我的想法是当我打开多个文件然后接收第一个文件路径作为args[0]
,第二个文件路径为args[1]
,依此类推,但是现在当我打开多个选定文件时,我的应用程序的多个实例就出现了。
问题是:如何执行多个files.ext并获取String[] args
中所有选定files.ext的路径,而不是我应用的不同实例。当我们选择multiples files.mp3并打开它时,就像VLC播放器一样。
答案 0 :(得分:0)
This article描述了如何仅强制应用程序的单个实例。您可以扩展此处描述的自定义窗口消息WM_SHOWME
,以将命令行参数传递给您的单个实例。
答案 1 :(得分:0)
最后我找到了另一种选择 使用“Mutex”仅运行我的应用程序的实例,并导入shell32.dll,我做到了 这样的事......
private static bool isAlreadyInstantiated()
{
new Mutex(true, "my_app", out mutex_bool);
return !mutex_bool;
}
private static void getSelectedFiles()
{
selected_files = new List<SelectedFile>();
String filename;
// Required ref: SHDocVw (Microsoft Internet Controls COM Object)
ShellWindows shell = new SHDocVw.ShellWindows();
foreach (SHDocVw.InternetExplorer window in shell)
{
filename = Path.GetFileNameWithoutExtension(window.FullName).ToLower();
if (filename.ToLowerInvariant() == "explorer")
{
Shell32.FolderItems items = ((Shell32.IShellFolderViewDual2)window.Document).SelectedItems();
if (selected_files.Count == 0)
{
foreach (Shell32.FolderItem item in items)
{
if (active_folder == Path.GetDirectoryName(item.Path))
selected_files.Add(new SelectedFile("\"" + item.Path + "\"", item.Name, Math.Round(((double)item.Size / (double)1024), 2)));
else
break;
}
}
else
return;
}
}
}