我有一個程序,在使用資源管理器中的右鍵單擊菜單打開文件時工作。但是,如果我選擇多個文件,然後右鍵單擊並用我的程序打開,它會打開我的程序的多個實例,而不是將多個文件作爲參數傳遞給單個實例。該程序是在vb.net中編寫的,但不是一個Windows窗體,它只是一個模塊,所以我可以在Visual Studio中的屬性中勾選Single實例選項。以多個文件作爲參數從瀏覽器中打開程序一次
那麼如何在單個實例中從資源管理器上下文菜單中打開多個文件。
我有一個程序,在使用資源管理器中的右鍵單擊菜單打開文件時工作。但是,如果我選擇多個文件,然後右鍵單擊並用我的程序打開,它會打開我的程序的多個實例,而不是將多個文件作爲參數傳遞給單個實例。該程序是在vb.net中編寫的,但不是一個Windows窗體,它只是一個模塊,所以我可以在Visual Studio中的屬性中勾選Single實例選項。以多個文件作爲參數從瀏覽器中打開程序一次
那麼如何在單個實例中從資源管理器上下文菜單中打開多個文件。
在這裏沒有快樂的答案,Windows資源管理器不提供一個簡單的方法來啓動您的程序通過所有選定的文件。這需要一個shell context menu handler,它們很難在託管代碼中編寫。到.NET 4.0不能安全編寫。
它很容易用VB.NET中的應用程序框架來模擬它,讓你的應用程序成爲一個單獨的實現StartupNextInstance event。唯一的問題是,這不是特別快。並且它在控制檯模式應用程序中不起作用。
那麼這個線程是10個月大。我喜歡添加一些東西。對於C#使用此參考"C# Example"
雖然我知道這是爲vb.net,我相信你可以使用這個C#代碼只是一些修改,這對我有用。也許這不是最好的辦法,但對我而言,這是最簡單的方法。它會在運行第二個副本之前檢查應用程序標題是否正在運行。
這是Program.cs中
static frmMain Form;
[STAThread]
static void Main(string[] args)
{
bool blnCurrentlyRunning = false;
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Process[] processes = Process.GetProcesses();
foreach (var item in processes)
{
if (item.MainWindowTitle.IndexOf("Application Title") != -1)
blnCurrentlyRunning = true;
}
if (!blnCurrentlyRunning)
{
Form = new frmMain();
Application.Run(Form);
}
else
{
Application.Exit();
}
}
此鏈接幫助我通過點擊上下文菜單項來獲得在資源管理器中選擇文件的路徑: .NET Shell Extensions - Shell Context Menus
它在C#語言,但正如該文章海報所說,它也可以在vb.net中使用。
真容易:)
希望這對你也有幫助! :)
這裏的步驟:
1)下載你SharpShell庫>>
在文章頂部下載「SharpShell庫」的壓縮文件,並添加一個參考下載SharpShell.dll文件。
,或者您可以通過的NuGet下載:
如果您已經安裝的NuGet,只是做了SharpShell快速搜索並直接安裝 - 或https://www.nuget.org/packages/SharpShell拿到包的詳細信息。
添加以下引用:
System.Windows.Forms
System.Drawing
你的代碼的頂部使用這些:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using SharpShell;
using SharpShell.SharpContextMenu;
using System.Windows.Forms;
using System.IO;
using System.Runtime.InteropServices;
using SharpShell.Attributes;
派生您的類從SharpContextMenu
右鍵單擊該行的SharpContextMenu部分,然後選擇Implement Abstract Class
。
CanShowMenu
這個函數被調用,以確定我們是否應顯示爲一組給定文件的上下文菜單擴展。用戶選擇的文件位於SelectedItemPaths
。我們可以檢查這些文件路徑,看看我們是否真的想顯示菜單。如果應該顯示菜單,請返回true
。如果不是,則返回false
。
CreateMenu
該函數被調用來實際創建上下文菜單。一個標準的WinForms ContextMenuStrip
是我們需要返回的。
這裏是整個命名空間源碼:
namespace CountLinesExtension
{
[ComVisible(true)]
[COMServerAssociation(AssociationType.ClassOfExtension, ".txt")]
public class Class1 : SharpContextMenu
{
protected override bool CanShowMenu()
{
// We will always show the menu.
return true;
//throw new NotImplementedException();
}
protected override ContextMenuStrip CreateMenu()
{
// Create the menu strip.
var menu = new ContextMenuStrip();
// Create a 'count lines' item.
var itemCountLines = new ToolStripMenuItem
{
Text = "Count Lines"
};
// When we click, we'll call the 'CountLines' function.
itemCountLines.Click += (sender, args) => CountLines();
// Add the item to the context menu.
menu.Items.Add(itemCountLines);
// Return the menu.
return menu;
//throw new NotImplementedException();
}
private void CountLines()
{
// Builder for the output.
var builder = new StringBuilder();
// Go through each file.
foreach (var filePath in SelectedItemPaths)
{
// Count the lines.
builder.AppendLine(string.Format("{0} - {1} Lines",
Path.GetFileName(filePath), File.ReadAllLines(filePath).Length));
}
// Show the ouput.
MessageBox.Show(builder.ToString());
}
}
}
接下來,我們必須給集強名稱。圍繞這個要求有辦法,但通常這是最好的方法。爲此,請右鍵單擊該項目並選擇「屬性」。然後去'簽名'。選擇'簽署大會',爲密鑰指定'新'並選擇一個密鑰名稱。如果你願意,你可以使用密碼保護的關鍵,但它不是必需
立即安裝並註冊Shell擴展: 的regasm工具
您可以使用該工具「regasm」來安裝並註冊外殼擴展。當使用regasm時,shell擴展將被安裝到註冊表中(即COM服務器的Class ID將被放入COM Server Classes部分並與實際服務器文件的路徑相關聯),它也將註冊這些關聯。
服務器管理器工具
服務器管理工具是我的,至少在開發過程中安裝/卸載和註冊/註銷,因爲它可以讓您安裝並註冊爲獨立的步驟首選方法。它還可以讓你指定你是否在32位或64位模式下安裝/卸載等。
這是整個Sample sourceCode。我們可以添加任意數量的上下文菜單項,任何函數,任何fileExtension等。