工控编程吧
标题:
375上位机VC MFC通过注册表获取全部开机启动软件
[打印本页]
作者:
qq263946146
时间:
2016-9-17 10:57
标题:
375上位机VC MFC通过注册表获取全部开机启动软件
(, 下载次数: 0)
上传
点击文件名下载附件
通过注册表获取全部开机启动软件
功能展示
系统启动都会有部分软件一同启动,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;
}
我们来演示下功能实现的整个过程
[iqiyi]http://player.video.qiyi.com/c9ecdb625cde453eb21473a1a63a1c56/0/0/w_19rswmzj5x.swf-albumId=6292784809-tvId=6292784809-isPurchase=0-cnId=12[/iqiyi]
(, 下载次数: 0)
上传
点击文件名下载附件 [weixinlianxi]1[/weixinlianxi]
[note]1[/note]
欢迎光临 工控编程吧 (https://www.gkbc8.com/)
Powered by Discuz! X3.4