193上位机VC MFC实现开机自动运行功能
193上位机VC MFC实现开机自动运行功能 功能展示 很多软件在电脑启动时也会随之启动运行,比如360电脑一开机就运行,比如腾讯QQ可以设置开机自动运行,我们当前例程也实现自己编写的程序在电脑开机自动运行功能,效果如图; 要点提示 程序开机自动运行功能分为两步: 1.用函数RegCreateKey()创建注册表Software\\Microsoft\\Windows\\CurrentVersion\\Run路径; 2.再用函数RegSetValueEx()将要自动启动程序的绝对路径写入以注册表中便可;此函的第二参数为程序名,如例程程序名为gkbc8 第五参数为程序的绝对路径; 一,RegCreateKey( hKey Long//要打开项的句柄,或者一个标准项名 lpSubKey String//欲创建的新子项。可同时创建多个项,只需用反斜杠将它们分隔开即可。例如 level1\level2\newkey phkResult Long//指定一个变量,用于装载新子项的句柄 )函数用于创建或打开注册表项。默认为创建,当注册表中有此项时。为打开 二, LONG RegSetValueEx( HKEY hKey, LPCTSTR lpValueName, DWORD Reserved, DWORD dwType, CONST BYTE *lpData, DWORD cbData ); hKey一个已打开项的句柄,或指定一个标准项名。 lpValueName指向一个字符串的指针,该字符串包含了欲设置值的名称。 若拥有该值名称的值并不存在于指定的注册表项中,则此函数将其加入到该项。如果此值是NULL,或指向空字符串, 则此函数为该项的默认值或未命名值设置类型和数据。 Reserved保留值,必须强制为0。 dwType指定将被存储的数据类型, 该参数可以为 REG_BINARY 任何形式的二进制数据 REG_DWORD 一个32位的数字 REG_DWORD_LITTLE_ENDIAN 一个“低字节在前”格式的32位数字 REG_DWORD_BIG_ENDIAN 一个“高字节在前”格式的32位数字 REG_EXPAND_SZ一个以0结尾的字符串,该字符串包含对环境变量 如“%PAHT”)的未扩展引用 REG_LINK 一个Unicode格式的带符号链接 REG_MULTI_SZ 一个以0结尾的字符串数组,该数组以连接两个0为终止符 REG_NONE 未定义值类型 REG_RESOURCE_LIST 一个设备驱动器资源列表 REG_SZ一个以0结尾的字符串 lpData指向一个缓冲区,该缓冲区包含了欲为指定值名称存储的数据。 cbData指定由lpData参数所指向的数据的大小, 单位是字节。 实现功能 1.新建基于对话框的应用程序 2.拖拽一按钮实现重启电脑测试用,添加自定义函数GetPrivilege()获取重启电脑权限用,此函数在程序初始时调用一下; 拖拽一选择框Id为IDC_CHECK1用于选择是否自动运行程序,双击关联选择触发函数 - void CGkbc8Dlg::GetPrivilege()//获得权限
- {
- static HANDLE hToken;
- static TOKEN_PRIVILEGES tp;
- static LUID luid;
- OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES|TOKEN_QUERY,&hToken);
- LookupPrivilegeValue(NULL,SE_SHUTDOWN_NAME,&luid);
- tp.PrivilegeCount =1;
- tp.Privileges [0].Luid =luid;
- tp.Privileges [0].Attributes =SE_PRIVILEGE_ENABLED;
- AdjustTokenPrivileges(hToken,FALSE,&tp,sizeof(TOKEN_PRIVILEGES),NULL, NULL);
- }
- void CGkbc8Dlg::OnReboot() //重启
- {
- ExitWindowsEx(EWX_REBOOT,0);
- }
复制代码- void CGkbc8Dlg::OnCheck1()
- {
- char buf[MAX_PATH];
- ::GetModuleFileName(NULL,buf,MAX_PATH);//EXE此程序的绝对路径
- //
- CString skey= "Software\\Microsoft\\Windows\\CurrentVersion\\Run";
- HKEY sub;
- ::RegCreateKey(HKEY_LOCAL_MACHINE,skey,&sub);
- //
- CButton* pCheck = (CButton*)GetDlgItem(IDC_CHECK1);
- if(pCheck->GetCheck()==0)//未选中
- ::RegSetValueEx(sub,"gkbc8",NULL,REG_SZ,(const BYTE*)buf,MAX_PATH);
- else if(pCheck->GetCheck()==1)//选中开机自动运行
- ::RegDeleteValue(sub,"gkbc8");
- }
复制代码3.在WIN7上运行时还得以管理员权限运行,或加载例程RES目录下AppName.exe.manifest文件到工程文件夹名设置为24,资源ID改为1,重新编译便可; 我们来演示整个功能实现过程
|