[C#] 讓副檔名和程式關聯
首先在檔案總管裡嘗試把一個新的副檔名關聯給記事本開啟
然後開啟登錄編輯器(REGEDIT)看看會增加哪些機碼
以關鍵字[._abcdefg]做搜尋
註: 其實還有其他機碼, 但經過測試只需要增加這兩個地方就夠了
所以要寫程式去關聯一個副檔名, 以下是步驟: (假設要關聯的副檔名是[.abc])
- 在[HKEY_CLASSES_ROOT]下新增一個[.abc]的機碼
- 給[.abc]一個[REG_SZ]的預設值, 值可以隨便設, 這邊假設是[abc_test]
- 然後在[HKEY_CLASSES_ROOT]下再新增一個[abc_test]的機碼 (和步驟2的預設值必須相對應)
- 在[abc_test]下新增[shell>edit>command]或[shell>open>command]機碼, 或兩個都增加, 端看你的需求 (不同處可以參考下圖)
- 給[command]一個[REG_EXPAND_SZ]的預設值, 設定方式就是[執行檔完整路徑 %1], [%1]指的是要被開啟的檔案
以下是關聯的程式碼
using Microsoft.Win32;
private void button1_Click(object sender, EventArgs e)
{
Registry.ClassesRoot.CreateSubKey(".abc").SetValue("", "abc_test", RegistryValueKind.String); //步驟1,2
Registry.ClassesRoot.CreateSubKey("abc_test\\shell\\open\\command").SetValue("", Application.ExecutablePath + " %1", RegistryValueKind.ExpandString); //步驟3,4,5
}
另外副檔名和程式關聯後
要如何知道程式是直接執行, 還是透過關聯的檔案執行呢?
我知道有兩種方式
一種是在Program.cs裡判斷
static void Main(string[] args)
{
if (args.Length > 0)
MessageBox.Show(args[0]); //如果從命令行下多個參數, 那args也會對應多個參數
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new Form1());
}
或者是用Environment.GetCommandLineArgs()方法來判斷
private void button2_Click(object sender, EventArgs e)
{
string[] args = Environment.GetCommandLineArgs(); //這裡會把執行檔完整路徑放在args[0], 後面接著才是參數
foreach (string arg in args)
MessageBox.Show(arg);
}
[範例Code下載]
by sam319