为指定的文件类型设立关联有很多方法,但这些方法在.Net中不能直接使用,今天从以前的代码中抽取一段利用反射功能实现建立文件类型关联的部分代码,以抛砖引玉,如有不妥之处,万望指教。
背景:这段代码是在我的一个小程序中使用到的,这个程序是一个自动代码生成器,名字叫做MyCodeCreator,有一个Solution的项目文件,扩展名为:mcclsn,现在我们为这个扩展名建立关联。
大家都知道建立关联无非是在注册表中动手脚,参考其它的扩展名的例子,我写了以下代码:
注册表存取方法
1 static RegistryKey OpenOrCreateSubKey(RegistryKey parent, string name, out eStatus status)
2 {
3 status = eStatus.Open;
4 RegistryKey sub = parent.OpenSubKey(name, true);
5 if (sub == null)
6 {
7 sub = parent.CreateSubKey(name, RegistryKeyPermissionCheck.ReadWriteSubTree);
8 status = eStatus.Create;
9 }
10
11 return sub;
12 }
1 static RegistryKey OpenOrCreateSubKey(RegistryKey parent, string name, out eStatus status)
2 {
3 status = eStatus.Open;
4 RegistryKey sub = parent.OpenSubKey(name, true);
5 if (sub == null)
6 {
7 sub = parent.CreateSubKey(name, RegistryKeyPermissionCheck.ReadWriteSubTree);
8 status = eStatus.Create;
9 }
10
11 return sub;
12 }
上面的一个方法是对注册表的存取。
1
enum
eStatus
2 {
3 Open,
4 Create
5 }
6
7 public static void AssocFileType()
8 {
9 RegistryKey lphKey = Registry.ClassesRoot;
10 string sKeyName, sKeyValue, sFileExt;
11 eStatus status;
12
13 sKeyName = "MCSF.File.1";
14 sKeyValue = "My CodeCreator Solution File";
15 sFileExt = ".mccsln";
16
17 RegistryKey sKey = OpenOrCreateSubKey(lphKey, sFileExt, out status);
18 if (status == eStatus.Create)
19 {
20 sKey.SetValue("", sKeyName);
21 sKey.SetValue("Content Type", "application/mccsln");
22 }
23
24 sKey = OpenOrCreateSubKey(lphKey, sKeyName, out status);
25 if (status == eStatus.Create)
26 {
27 sKey.SetValue("", sKeyValue);
28 sKey.SetValue("BrowserFlags", 8);
29 sKey.SetValue("EditFlags", 0);
30 }
31
32 string path = Application.ExecutablePath + ",0";
33 RegistryKey icon = OpenOrCreateSubKey(sKey, "DefaultIcon", out status);
34 string regPath = icon.GetValue("", "").ToString();
35 if (status == eStatus.Create)
36 icon.SetValue("", path);
37 else
38 {
39 if (!path.Equals(regPath))
40 icon.SetValue("", path);
41 }
42 icon.Close();
43
44 sKey = OpenOrCreateSubKey(sKey, "shell", out status);
45 sKey = OpenOrCreateSubKey(sKey, "open", out status);
46 RegistryKey cmd = OpenOrCreateSubKey(sKey, "command", out status);
47 string cmdline = string.Format("\"{0}\" \"%1\"", Application.ExecutablePath);
48 string regCmdline = cmd.GetValue("", "").ToString();
49 if (status == eStatus.Create)
50 cmd.SetValue("", cmdline);
51 else
52 {
53 if (!cmdline.Equals(regCmdline))
54 cmd.SetValue("", cmdline);
55 }
56
57 RegistryKey dde = OpenOrCreateSubKey(sKey, "ddeexec", out status);
58 if (status == eStatus.Create)
59 {
60 OpenOrCreateSubKey(dde, "Application", out status).SetValue("", "MyCodeCreator");
61 OpenOrCreateSubKey(dde, "Topic", out status).SetValue("", "System");
62 }
63 dde.Close();
64
65 sKey.Flush();
66 sKey.Close();
67
68 lphKey.Close();
69 }
2 {
3 Open,
4 Create
5 }
6
7 public static void AssocFileType()
8 {
9 RegistryKey lphKey = Registry.ClassesRoot;
10 string sKeyName, sKeyValue, sFileExt;
11 eStatus status;
12
13 sKeyName = "MCSF.File.1";
14 sKeyValue = "My CodeCreator Solution File";
15 sFileExt = ".mccsln";
16
17 RegistryKey sKey = OpenOrCreateSubKey(lphKey, sFileExt, out status);
18 if (status == eStatus.Create)
19 {
20 sKey.SetValue("", sKeyName);
21 sKey.SetValue("Content Type", "application/mccsln");
22 }
23
24 sKey = OpenOrCreateSubKey(lphKey, sKeyName, out status);
25 if (status == eStatus.Create)
26 {
27 sKey.SetValue("", sKeyValue);
28 sKey.SetValue("BrowserFlags", 8);
29 sKey.SetValue("EditFlags", 0);
30 }
31
32 string path = Application.ExecutablePath + ",0";
33 RegistryKey icon = OpenOrCreateSubKey(sKey, "DefaultIcon", out status);
34 string regPath = icon.GetValue("", "").ToString();
35 if (status == eStatus.Create)
36 icon.SetValue("", path);
37 else
38 {
39 if (!path.Equals(regPath))
40 icon.SetValue("", path);
41 }
42 icon.Close();
43
44 sKey = OpenOrCreateSubKey(sKey, "shell", out status);
45 sKey = OpenOrCreateSubKey(sKey, "open", out status);
46 RegistryKey cmd = OpenOrCreateSubKey(sKey, "command", out status);
47 string cmdline = string.Format("\"{0}\" \"%1\"", Application.ExecutablePath);
48 string regCmdline = cmd.GetValue("", "").ToString();
49 if (status == eStatus.Create)
50 cmd.SetValue("", cmdline);
51 else
52 {
53 if (!cmdline.Equals(regCmdline))
54 cmd.SetValue("", cmdline);
55 }
56
57 RegistryKey dde = OpenOrCreateSubKey(sKey, "ddeexec", out status);
58 if (status == eStatus.Create)
59 {
60 OpenOrCreateSubKey(dde, "Application", out status).SetValue("", "MyCodeCreator");
61 OpenOrCreateSubKey(dde, "Topic", out status).SetValue("", "System");
62 }
63 dde.Close();
64
65 sKey.Flush();
66 sKey.Close();
67
68 lphKey.Close();
69 }
上面的代码意思很简单,无非就是照猫画虎而已。如果你需要套用上面的代码需要改动的地方不多,例如扩展名啊,可执行文件位置啊,图标等等。值得注意的事,当你执行完这些操作以后,关联不会马上生效,不知道什么原因,还望高手指教。
本文原发:无垠IT教学网