08年的文章~
看好多人都在写工具设置THEIS_HOME和THEIS_Config,那天看到白同学说嫌输入路径烦,我就突然想到可以做个绑定到右键菜单的东西。这不,昨天晚上给弄完了...
主要思想:选中某个文件夹,点右键,会出现SetTheisHome字样,选择SetTheisHome会将选中文件夹设成Theis_home的值,其下级目录Config为Theis_Config的值用到的技术:
1.操作注册表
修改右键菜单,昨天在网上找到几个方法,这里列两个,一个是文件的右键菜单,一个是文件夹的右键菜单
文件的右键菜单注册表位置: /HKEY_CLASSES_ROOT/*/shell
示例代码
- RegistryKey reg;
- reg = Registry.ClassesRoot;
- reg=reg.CreateSubKey(@"*/shell/myApp");
- //创建新项myApp
- reg.SetValue("","我的程序");
- //设置项值
- reg = Registry.ClassesRoot;
- reg.CreateSubKey(@"*/shell/myApp/command");
- //创建新项command
- reg.SetValue("",Application.ExecutablePath+" %1");
- //设置command的值
- reg.Close();
HKEY_CLASSES_ROOT/Directory/shellex/ContextMenuHandlers
- [HKEY_LOCAL_MACHINE/SOFTWARE/Classes/Directory/shell/SetTheisHome]
- @="SetTheisHome"
- [HKEY_LOCAL_MACHINE/SOFTWARE/Classes/Directory/shell/SetTheisHome/command]
- @="D://ChangeEnvironmentVar.exe %1"
2.还是操作注册表
右键菜单有了,下一步就得是执行程序,改变环境变量的值了。据说可以用Registry和RegistryKey来实现,两者的区别有待研究。
- //获得环境变量路径
- RegistryKey pregkey =
- Registry.LocalMachine.OpenSubKey(@"SYSTEM/CurrentControlSet/Control/Session Manager/Environment", true);
- try
- {
- if (pregkey == null)
- {
- MessageBox.Show("键值不存在");
- }
- else
- {
- if (pregkey.GetValue("THEIS_HOME") == null)
- {
- pregkey.CreateSubKey("THEIS_HOME");
- }
- pregkey.SetValue("THEIS_HOME", directory);
- if (pregkey.GetValue("THEIS_Config") == null)
- {
- pregkey.CreateSubKey("THEIS_Config");
- }
- pregkey.SetValue("THEIS_Config", directory + @"/Config");
- }
- }
- catch(Exception ex)
- {
- MessageBox.Show("Change environment had been failed." + ex.ErrorMessage);
- }
- finally
- {
- if (pregkey != null) pregkey.Close();
- }
后记:调查了一下,发现用修改注册表的方法来修改环境变量还差了一步,需要用SendMessage广播一下环境变量的改变,不然就得重启机器或者注销,反正就是不好用了。(google上搜 注册表+环境变量+生效可以查到相应原因)
还是乖乖用Enviroment.SetEnviromentVariable吧,本想的是,既然这个方法好使,可以先看看.net源码是怎么写的,是不是也是改了注册表然后用什么广播,不幸的是,不是,.net是用 Win32Native.SetEnviroment...什么设的。我不能用。。。
不过,看到.net源码了,不错的说,一行注释没有,看的很明白。看来以后最好能每天看一个源码,现在看代码已经不像以前那么兴奋了,大概已经习惯了现在的文档生活了吧....
因为还有其他环境变量,我本来想要做个右键级联菜单,可惜,查了查说是要用shell什么的,不懂。。。下了一个源码,都是英文,不但眼花,而且是C++的,多年不看,都不知道C++怎么玩了,自己汗一个先...作罢,就这么着吧。