通过计划任务实现开机自启动
实现原理:
windows系统可以设置计划任务来执行一些定时任务。创建一个计划任务,设置任务的触发条件以及执行操作。将触发条件设置为用户登录,执行操作设置为启动目标程序。这样,程序就可以实现开机自启动功能了。
注意:创建计划任务要求程序必须要有管理员权限。
实现过程:
(1).初始化操作
1.初始化COM接口环境
2.创建任务服务对象ITaskService,并将其链接到任务服务上
3.从ITaskService对象中获取根任务 Root Task Folde r的指针对象ITaskFolder,这个指针指向的是新注册的任务。
(2).创建任务技术
1.创建任务定义对象来创建任务
2.对任务定义对象 ITaskDefinition 进行设置
3.使用 ITaskFolder 对象并利用任务定义对象 ITaskDefinition 的设置,注册任务计划
实现代码:
//CMyTaskSchedule.h #pragma once #include <taskschd.h> #pragma comment(lib, "taskschd.lib") class CMyTaskSchedule { public: CMyTaskSchedule(); ~CMyTaskSchedule(); //************************************ // 函数名: CMyTaskSchedule::NewTask // 返回类型: BOOL // 功能: 创建计划任务 // 参数1: char * lpszTaskName 计划任务名 // 参数2: char * lpszProgramPath 计划任务路径 // 参数3: char * lpszParameters 计划任务参数 // 参数4: char * lpszAuthor 计划任务作者 //************************************ BOOL NewTask(char* lpszTaskName, char* lpszProgramPath, char* lpszParameters, char* lpszAuthor); //************************************ // 函数名: CMyTaskSchedule::Delete // 返回类型: BOOL // 功能: 删除计划任务 // 参数1: char * lpszTaskName 计划任务名 //************************************ BOOL Delete(char* lpszTaskName); private: ITaskService *m_lpITS; ITaskFolder *m_lpRootFolder; };
//CMyTaskSchedule.cpp #include "pch.h" #include "CMyTaskSchedule.h" CMyTaskSchedule::CMyTaskSchedule() { m_lpITS = NULL; m_lpRootFolder = NULL; //初始化COM HRESULT hr = CoInitialize(NULL); if (FAILED(hr)) { MessageBox(NULL, L"初始化COM接口环境失败!", L"Error", MB_OK); return; } //创建任务服务对象 hr = CoCreateInstance(CLSID_TaskScheduler, NULL, CLSCTX_INPROC_SERVER, IID_ITaskService, (LPVOID*)(&m_lpITS)); if (FAILED(hr)) { MessageBox(NULL, L"创建任务服务对象失败!", L"Error", MB_OK); return; } //连接到任务服务 hr = m_lpITS->Connect(_variant_t(), _variant_t(), _variant_t(), _variant_t()); if (FAILED(hr)) { MessageBox(NULL, L"连接到任务服务失败!", L"Error", MB_OK); return; } //获取根任务的指针 //获取Root Task Folder 的指针 ,这个指针指向的是新注册的任务 hr = m_lpITS->GetFolder(_bstr_t("\\"), &m_lpRootFolder); if (FAILED(hr)) { MessageBox(NULL, L"获取根任务的指针失败!", L"Error", MB_OK); return; } } CMyTaskSchedule::~CMyTaskSchedule() { if (m_lpITS) { m_lpITS->Release(); } if (m_lpRootFolder) { m_lpRootFolder->Release(); } // 卸载COM CoUninitialize(); } //创建任务计划 BOOL CMyTaskSchedule::NewTask(char* lpszTaskName, char* lpszProgramPath, char* lpszParameters, char* lpszAuthor) { if (NULL == m_lpRootFolder) { return FALSE; } //如果存在相同的计划任务,则删除 Delete(lpszTaskName); //创建任务定义对象来创建任务 ITaskDefinition *pTaskDefinition = NULL; HRESULT hr = m_lpITS->NewTask(0, &pTaskDefinition); if (FAILED(hr)) { MessageBox(NULL, L"创建任务失败!", L"Error", MB_OK); return FALSE; } //设置注册信息 IRegistrationInfo *pRegInfo = NULL; CComVariant variantAuthor(NULL); variantAuthor = lpszAuthor; hr = pTaskDefinition->get_RegistrationInfo(&pRegInfo); if (FAILED(hr)) { MessageBox(NULL, L"设置注册信息失败!", L"Error", MB_OK); return FALSE; } // 设置作者信息 hr = pRegInfo->put_Author(variantAuthor.bstrVal); pRegInfo->Release(); // 设置登录类型和运行权限 IPrincipal *pPrincipal = NULL; hr = pTaskDefinition->get_Principal(&pPrincipal); if (FAILED(hr)) { MessageBox(NULL, L"设置登录类型和运行权限失败!", L"Error", MB_OK); return FALSE; } // 设置登录类型 hr = pPrincipal->put_LogonType(TASK_LOGON_INTERACTIVE_TOKEN); // 设置运行权限 // 最高权限 hr = pPrincipal->put_RunLevel(TASK_RUNLEVEL_HIGHEST); pPrincipal->Release(); // 设置其他信息 ITaskSettings *pSettting = NULL; hr = pTaskDefinition->get_Settings(&pSettting); if (FAILED(hr)) { MessageBox(NULL, L"设置其他信息失败!", L"Error", MB_OK); return FALSE; } // 设置其他信息 hr = pSettting->put_StopIfGoingOnBatteries(VARIANT_FALSE); hr = pSettting->put_DisallowStartIfOnBatteries(VARIANT_FALSE); hr = pSettting->put_AllowDemandStart(VARIANT_TRUE); hr = pSettting->put_StartWhenAvailable(VARIANT_FALSE); hr = pSettting->put_MultipleInstances(TASK_INSTANCES_PARALLEL); pSettting->Release(); // 创建执行动作 IActionCollection *pActionCollect = NULL; hr = pTaskDefinition->get_Actions(&pActionCollect); if (FAILED(hr)) { MessageBox(NULL, L"创建执行动作失败!", L"Error", MB_OK); return FALSE; } IAction *pAction = NULL; // 创建执行操作 hr = pActionCollect->Create(TASK_ACTION_EXEC, &pAction); pActionCollect->Release(); // 设置执行程序路径和参数 CComVariant variantProgramPath(NULL); CComVariant variantParameters(NULL); IExecAction *pExecAction = NULL; hr = pAction->QueryInterface(IID_IExecAction, (PVOID *)(&pExecAction)); if (FAILED(hr)) { pAction->Release(); MessageBox(NULL, L"创建执行动作失败!", L"Error", MB_OK); return FALSE; } pAction->Release(); // 设置程序路径和参数 variantProgramPath = lpszProgramPath; variantParameters = lpszParameters; pExecAction->put_Path(variantProgramPath.bstrVal); pExecAction->put_Arguments(variantParameters.bstrVal); pExecAction->Release(); // 设置触发器信息,包括用户登录时触发 ITriggerCollection *pTriggers = NULL; hr = pTaskDefinition->get_Triggers(&pTriggers); if (FAILED(hr)) { MessageBox(NULL, L"设置触发器信息失败!", L"Error", MB_OK); return FALSE; } // 创建触发器 ITrigger *pTrigger = NULL; hr = pTriggers->Create(TASK_TRIGGER_LOGON, &pTrigger); if (FAILED(hr)) { MessageBox(NULL, L"创建触发器失败!", L"Error", MB_OK); return FALSE; } // 注册任务计划 IRegisteredTask *pRegisteredTask = NULL; CComVariant variantTaskName(NULL); variantTaskName = lpszTaskName; hr = m_lpRootFolder->RegisterTaskDefinition(variantTaskName.bstrVal, pTaskDefinition, TASK_CREATE_OR_UPDATE, _variant_t(), _variant_t(), TASK_LOGON_INTERACTIVE_TOKEN, _variant_t(""), &pRegisteredTask); if (FAILED(hr)) { pTaskDefinition->Release(); MessageBox(NULL, L"注册任务计划失败!", L"Error", MB_OK); return FALSE; } pTaskDefinition->Release(); pRegisteredTask->Release(); return TRUE; } //删除计划任务 BOOL CMyTaskSchedule::Delete(char* lpszTaskName) { if(NULL == m_lpRootFolder) { return FALSE; } CComVariant variantTaskName(NULL); variantTaskName = lpszTaskName; HRESULT hr = m_lpRootFolder->DeleteTask(variantTaskName.bstrVal, 0); if (FAILED(hr)) { return FALSE; } return TRUE; }
直面挫折,顽强生长