| 375上位机VC MFC通过注册表获取全部开机启动软件   通过注册表获取全部开机启动软件
 功能展示
 系统启动都会有部分软件一同启动,360等一些软件就有开机启动软件管理,我们当前例程也通过注册表实现系统全部开机的获取,效果如图,点击<读取开机软件>例程会读取注册存放开机软件位置的子项,将结果显示在列表框中,另一个按钮是将软件设置为开机启动,但在WIN7系统中还得获得权限,在这不做演示;
 
 要点提示
 软件随同系统一起启动的方法很多,最常见的就是通过读取注册表 “Run”子键值来实现,这也是目前最常见的自启动程序用于加载的地方。这个键同时位于〔HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run〕和〔HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Run〕下。当前例程是通过读取第二个位置的RUN子键实现;
 注册表子键下全部值的遍历可以用函数RegEnumValue()实现;函数原型为
 LONG RegEnumValue( HKEY hKey, DWORD dwIndex, LPTSTR lpValueName, LPDWORD lpcbValueName, LPDWORD lpReserved, LPDWORD lpType, LPBYTE lpData, LPDWORD lpcbData );
 hKey Long,一个已打开项的句柄,或者指定一个标准项名
 dwIndex Long,欲获取值的索引。注意第一个值的索引编号为零
 lpValueName String,用于装载位于指定索引处值名的一个缓冲区
 lpcbValueName Long,用于装载lpValueName缓冲区长度的一个变量。一旦返回,它会设为实际载入缓冲区的字符数量,所以要注意的是再次使用时得重新赋值,可参阅例程。
 lpReserved Long,未用;设为零
 lpType Long,用于装载值的类型代码的变量
 lpData Byte,用于装载值数据的一个缓冲区
 lpcbData Long,用于装载lpData缓冲区长度的一个变量。一旦返回,它会设为实际载入缓冲区的字符数量
 
 实现功能
 1.新建基于对话框的应用程序
 2.添加一列表控件关联变量 CListCtrl m_List;用于显示获取的启动软件,添加按钮<写入注册表 实现开机启动><读取注册表 全部开机启动软件>关联点击函数
 void CGkbc8Dlg::OnWrite()
 {
 CRegKey myKey;
 if(myKey.Open(HKEY_LOCAL_MACHINE, "Software\\Microsoft\\Windows\\CurrentVersion\\Run") != ERROR_SUCCESS)
 AfxMessageBox("error open reg key!!!");
 else
 {
 CString path;
 GetModuleFileName(NULL,path.GetBufferSetLength(MAX_PATH+1),MAX_PATH);
 path.ReleaseBuffer();
 if(myKey.SetKeyValue("工控编程吧", path) != ERROR_SUCCESS)
 AfxMessageBox("error SET VALUE!!!");
 }
 myKey.Close();
 }
 void CGkbc8Dlg::OnRead()
 {
 m_List.DeleteAllItems();
 AllRegKey(HKEY_LOCAL_MACHINE, TEXT("SoftWare\\Microsoft\\Windows\\CurrentVersion\\Run"));
 }
 再添加两自定义函数, BOOL AllRegKeyValue(HKEY hRootKey, LPCTSTR szSubKey); //遍历子键全部值
 BOOL AllRegKey(HKEY hRootKey, LPCTSTR szSubKey); //遍历子键的全部子键。实现注册表子键值的遍历
 BOOL CGkbc8Dlg::AllRegKey(HKEY hRootKey, LPCTSTR szSubKey)
 {
 if(!AllRegKeyValue( hRootKey, szSubKey) )
 return FALSE;
 
 HKEY hSubKey;
 DWORD dwIndex = 0;
 long lResult;
 lResult = RegOpenKeyEx(hRootKey, szSubKey, 0, KEY_READ, &hSubKey); // 打开注册表
 if(ERROR_SUCCESS == lResult)
 {
 TCHAR szKeyName[256] = { 0 };
 DWORD cbName = 256*sizeof(TCHAR);
 lResult = RegEnumKeyEx(hSubKey, dwIndex, szKeyName, &cbName, 0, NULL, NULL, NULL); // 获取字段
 while (lResult == ERROR_SUCCESS)
 {
 AllRegKeyValue(hSubKey,szKeyName);
 
 cbName = 256*sizeof(TCHAR);//必需重新赋值
 dwIndex++;
 lResult = RegEnumKeyEx(hSubKey, dwIndex, szKeyName, &cbName, 0, NULL, NULL, NULL);
 }
 RegCloseKey(hSubKey); // 关闭注册表
 return TRUE;
 }
 RegCloseKey(hSubKey);
 return FALSE;
 }
 
 我们来演示下功能实现的整个过程
 
   如果您认可,可联系功能定制! 如果您着急,充值会员可直接联系发您资料!    
 
 
 
 
 |