Title

程序开机自启动与取消自启动

程序开机自启动与取消自启动
设置或者删除程序的注册表信息以达到开机自启动或者取消开机自启动的目的。

那么开始介绍:
函数原型如下:

int SetReg(
    bool set,//设置(true)或取消(false)本程序的开机自启动
    TCHAR *Value//写入注册表时的值的名称,如无特殊需要,单个程序中务必只使用一个名称作为值
);

返回值:
1表示成功操作
0表示失败操作
-1表示异常操作

代码如下:

int Setting::SetReg(bool set, const TCHAR* Value) {//开机自启动设置
    HKEY hKey;//设置主根键
    TCHAR pFileName[MAX_PATH] = { 0 };//得到程序自身的全路径 
    DWORD dwRet = GetModuleFileName(NULL, pFileName, MAX_PATH);
    LPCTSTR lpRun = L"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run";
    DWORD type = REG_SZ;
    //先以阅读模式打开注册表
    if (RegOpenKeyEx(HKEY_CURRENT_USER, lpRun, 0, KEY_ALL_ACCESS, &hKey) != ERROR_SUCCESS) {
        return 0;//阅读模式打开不成功
    }
    //然后检测Value中的值是否存在
    if ((RegQueryValueEx(hKey, Value, 0, &type, NULL, NULL) == ERROR_SUCCESS)) {//如果存在,则删除
        if (!set) {
            RegCloseKey(hKey);
            if (RegOpenKeyEx(HKEY_CURRENT_USER, lpRun, 0, KEY_ALL_ACCESS, &hKey) != ERROR_SUCCESS)
                return 0;//写入模式打开不成功
            if (RegDeleteValue(hKey, Value) != ERROR_SUCCESS)
                return 0;//删除不成功
            //删除名称为Value中的值的注册表信息
        }
        else
            return -1;//删除不存在的注册表项或者添加已经存在的注册表项
    }
    else if (set) {//如果不存在并且是要设置
        RegCloseKey(hKey);
        if (RegOpenKeyEx(HKEY_CURRENT_USER, lpRun, 0, KEY_ALL_ACCESS, &hKey) != ERROR_SUCCESS) {
            return 0;//写入模式打开不成功
        }
        if (RegSetValueEx(hKey, Value, 0, REG_SZ, (BYTE*)pFileName, (lstrlen(pFileName) + 1) * sizeof(TCHAR)) != ERROR_SUCCESS)
            return 0;//写入不成功
        //将Value的值写入的注册表
    }
    else
        return -1;//删除不存在的注册表项或者添加已经存在的注册表项
    RegCloseKey(hKey);//关闭注册表
    return 1;//操作成功
}

但是要注意:

自启打开的exe可能不在exe所在的工作目录,所以要切换到对应的工作目录,所用函数如下

BOOL SetCurrentDirectory(
  [in] LPCTSTR lpPathName
);

 

posted @ 2023-01-10 20:27  WAASSTT  阅读(260)  评论(0)    收藏  举报
Title