[C#] 讓副檔名和程式關聯

[C#] 讓副檔名和程式關聯

操作環境: ,

 

首先在檔案總管裡嘗試把一個新的副檔名關聯給記事本開啟

image

 

然後開啟登錄編輯器(REGEDIT)看看會增加哪些機碼
以關鍵字[._abcdefg]做搜尋

image

image

註: 其實還有其他機碼, 但經過測試只需要增加這兩個地方就夠了

 

所以要寫程式去關聯一個副檔名, 以下是步驟: (假設要關聯的副檔名是[.abc])

  1. 在[HKEY_CLASSES_ROOT]下新增一個[.abc]的機碼
  2. 給[.abc]一個[REG_SZ]的預設值, 值可以隨便設, 這邊假設是[abc_test]
  3. 然後在[HKEY_CLASSES_ROOT]下再新增一個[abc_test]的機碼 (和步驟2的預設值必須相對應)
  4. 在[abc_test]下新增[shell>edit>command]或[shell>open>command]機碼, 或兩個都增加, 端看你的需求 (不同處可以參考下圖)
  5. 給[command]一個[REG_EXPAND_SZ]的預設值, 設定方式就是[執行檔完整路徑 %1], [%1]指的是要被開啟的檔案

image

 

以下是關聯的程式碼

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