本人目前菜鸟级选手,只是想把学到的一点知识与大家进行分享,如有说的不正确的地方还请各位大神多多指点,本人非常乐意去学习。
本文内容如有从网上搜到的会提示说明并标注原地址。下面正文,
关于实现开机自启动的功能,大家首先想到的就是使用注册表去实现,这也是比较理想的方法。的确,注册表开机自启动确实给人很专业的感觉,但是不得不注意一点,如果你写的软件是针对win7的时候你不得不考虑一下UAC权限的问题。
先给大家贴一下关于如何把你的程序启动项加到注册表的代码吧。
void OnBnClickedCheckAutorun(bool _bAutoStart)
{
char cFilePath[255] = {0};
HMODULE hFilePath = GetModuleHandle(NULL);
//得到当前执行文件的全路径
GetModuleFileName(hFilePath, cFilePath, sizeof(cFilePath));
if (_bAutoStart)
{
//设置开机启动
//打开注册表
HKEY hKey;
iRet = RegOpenKeyEx(HKEY_LOCAL_MACHINE,
"Software\\Microsoft\\Windows\\CurrentVersion\\Run", 0, KEY_SET_VALUE, &hKey );
if (iRet != ERROR_SUCCESS)
{
return ;
}
//写入注册表
iRet = RegSetValueEx(hKey, "文件名", 0, REG_SZ, (BYTE*)(LPCSTR)cFilePath, sizeof (cFilePath));
//关闭注册表
RegCloseKey(hKey);
}
else
{
//取消设置开机启动
//打开注册表
HKEY hKey;
iRet = RegOpenKeyEx(HKEY_LOCAL_MACHINE,
"Software\\Microsoft\\Windows\\CurrentVersion\\Run", 0, KEY_SET_VALUE, &hKey );
if (iRet != ERROR_SUCCESS)
{
return ;
}
//删除注册表中内容
iRet = RegDeleteValue(hKey, "文件名");
if (iRet != ERROR_SUCCESS)
{
return ;
}
//关闭注册表
RegCloseKey(hKey);
}
}
其中红字的路径便是注册表存放开机启动项的路径,当然这不是唯一一个开机启动项的路径,但是通常情况下都会用这个,大家的程序中如果有这段代码之后,就已经实现了开机自启动程序的功能了,大家可以通过在【运行】中输入【regedit】,再根据上面的路径看看自己的程序有没有写进注册表中,当然最好是重启计算机,真实测一下功能是否已经实现。
下面说几点注意事项,完全是我在做这个功能的时候走的弯路,不适用于所有人,你们比我强多了。
1、往注册表中写的键值对应的路径最好是程序实际的路径,网上大部分是给出了一个系统文件路径,然后把我们想启动的文件路径利用CopyFile函数复制到系统文件下,这样确实挺好,(至于好在哪我也不知道,感觉,可能是防止文件本身被破坏),但是我要说的是,如果你想启动的这个程序里动态加载了一些库的话,你就要慎重考虑一下了,因为开机启动的时候系统调的是这个系统文件夹下的程序,但是库一般都在该程序所在路径附近,所以不难想象,一定会报加载库失败等错误。
2、另一个我遇到的问题就是删除注册表项的时候,不知道用什么函数,找了好多地方,最后从一篇博客中找到了RegDeleteValue()这个函数可以实现。
此博客地址:http://hi.baidu.com/nange151/item/34c8888417ecbed3d1f8cd25
好了,现在准确的说只实现了在winXp下开机自启动的功能,因为当你用同样的程序在win7下运行的时候会发现虽然在注册表中写入成功了,但是开机的时候就是不启动,目前根据我在网上看的相关问题,大部分说的原因都是win7的UAC权限惹的祸,但是真正能解决问题的办法我真的没找到。
目前我发现的两种方法我还是跟大伙说一下吧
1、把VS【属性】-【Linker】-【Manifest File】-【UAC执行等级】调成highestAvailable,但实话实说,我感觉P用没有。
2、就是在控制面板里把UAC权限调到最低,OK,这个是真好使,但是软件没有那么写的啊?难道你会告诉客户说,你用开机自启动功能的时候记得把UAC关掉?不过话说,我们公司有一款软件据我所知确实是这么建议客户的。我囧!
下面说说我解决如何在win7下能达到最好效果的开机自启动的方法吧,据我查找目前网上没有一篇是讲这种方法的,不知道合适不合适,不合适的地方大神们可以鞭笞我~
因为软件也要求在win7上使用,我实在是解决不了UAC的问题,所以我只能换种方法,于是我想到了用windows启动项,好吧,对于老鸟来说这是很正常的,但是我菜,所以想了一会儿才想到。过程我就不说了,直接说方法。
1、当设置开机自启动功能的时候给程序创建个快捷方式,并把这个快捷方式复制到【开始】-【所有程序】-【启动】文件夹下。这样不用管什么权限不权限的,无论在哪都可以照常自启动了。但是问题的难点在于取消设置开机自启动。
2、取消的时候其实就是直接使用DeleteFile()函数把快捷方式删除就OK了。
这个方法真的非常好用,而且我也发现了lotus notes这个软件设置开机自启动也是这么搞的。取消的这个方法完全是自己YY出来的。
下面写的有点费话,有兴趣的看下。
因为网上在删除快捷方式这块大部分都是使用SHFileOperation这个函数去操作,而当时我用这个函数的时候还遇到了一个问题就是删除的时候会有个提示框提示“是否删除到回收站”当时我就傻眼了,这不是扯蛋么?做个自启动功能还能整出个这东西?真不好。再后来虽然发现用这个FOF_NOCONFIRMATION宏可以隐藏提示框,但是最要命的一个问题是快捷方式移到了回收站里,无缘无故的回收站里多出一条也不好,然后就想怎么才能把回收站里的快捷方式删除呢?最后费了好大劲都没有找到好的方法,很郁闷了都,最后突然想到直接删了就好了,何必绕这么大的圈子呢?最后就用了这么一行DeleteFile(_pcLinkPath);搞定了。
事实说明,遇到问题应该多多转换下思路,不能一条路走到黑。
后面实现的代码放到附件里了,有兴趣的看看,大致写一下,不是源码,凑合看。
欢迎各位批评指正。