Windows Practice_文件_注册表操作
来源:互联网 发布:双十一淘宝宣传视频 编辑:程序博客网 时间:2024/05/22 15:51
Windows中的注册表
我们会好奇,为什么在我们双击一个文件的时候,会用合适的程序来运行呢?比如说.jpg文件在双击的时候就会用图片查看软件打开,这是为什么呢?
因为文件的后缀名帮助操作系统如何打开,也可以自定义。
我们知道notepad可以打开.txt文件,但是notepad不能打开.mystyle的后缀名,如果我们想用notepad打开这样的后缀名的文件,那么应该对操作系统进行设置,具体的说应该是注册表的修改。
我们看一个注册表例子:
使用Windows + R组合键可以打开注册表,也可以在cmd输入regedit打开注册表。
打开之后,我们可以在根键HKEY_CLASSES_ROOT下找到.txt的子键,
我们可以参考这个例子,来写一个程序,将.mystyle后缀名的文件使用vs2015打开。
修改自定义后缀文件的默认打开程序
bool SetDefaultOpenApplication(){ bool bRet = false; HKEY hKey = nullptr; DWORD dwDisposition; TCHAR strErrorMessage[MAXBYTE] = { 0 }; do { long lRet = RegCreateKeyEx(HKEY_CLASSES_ROOT, L".mystyle", 0, nullptr, REG_OPTION_VOLATILE, KEY_ALL_ACCESS, nullptr, &hKey, &dwDisposition); if (lRet != ERROR_SUCCESS) { FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, nullptr, lRet, 0, strErrorMessage, MAXBYTE, nullptr); MessageBox(nullptr, strErrorMessage, L"提示", MB_OK); break; } wchar_t str[] = L"VisualStudio.cpp.14.0"; lRet = RegSetValueExW(hKey, L"", 0, REG_SZ, reinterpret_cast<const unsigned char *>(str), sizeof(wchar_t)*wcslen(str)); if (lRet != ERROR_SUCCESS) { FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, nullptr, lRet, 0, strErrorMessage, MAXBYTE, nullptr); MessageBox(nullptr, strErrorMessage, L"提示", MB_OK); break; } bRet = true; } while (false); if (hKey) { RegCloseKey(hKey); } return bRet;}
我们在设置之前打开时出现:
运行这段代码之后,在双击该文件,
说明已经能打开了。
同时我们在注册表中也能看到
说明修改注册表成功。
开机自动启动的设置和取消
bool AutoRunSelf(){ bool bRet = false; TCHAR strErrorMessage[MAXBYTE] = { 0 }; TCHAR strFileFath[MAXBYTE] = { 0 }; HKEY hkey = nullptr; TCHAR *pData = TEXT("SOFTWARE\\Microsoft\\WOW6432Node\\Windows\\CurrentVersion\\Run"); long lRet; do { DWORD dwDisposition; // 使用RegOpenKeyExW和RegCreateKeyExW两种方式的效果是一样的 //lRet = RegOpenKeyExW(HKEY_CURRENT_USER, pData, 0, KEY_ALL_ACCESS, &hkey); lRet = RegCreateKeyExW(HKEY_CURRENT_USER, pData, 0, nullptr, REG_OPTION_VOLATILE, KEY_ALL_ACCESS, nullptr, &hkey, &dwDisposition); if (lRet != ERROR_SUCCESS) { FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, nullptr, lRet, 0, strErrorMessage, MAXBYTE, nullptr); MessageBox(nullptr, strErrorMessage, L"提示", MB_OK); break; } GetModuleFileName(nullptr, strFileFath, MAXBYTE); lRet = RegSetValueExW(hkey, TEXT("MyAutoRunApplication"), 0, REG_SZ, reinterpret_cast<const BYTE *>(strFileFath), sizeof(wchar_t)*wcslen(strFileFath)); if (lRet != ERROR_SUCCESS) { FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, nullptr, lRet, 0, strErrorMessage, MAXBYTE, nullptr); MessageBox(nullptr, strErrorMessage, L"提示", MB_OK); break; } bRet = true; } while (false); if (hkey) { RegCloseKey(hkey); } system("pause"); return bRet;}bool CancelAutoRun(){ bool bRet = false; TCHAR strErrorMessage[MAXBYTE] = { 0 }; HKEY hkey = nullptr; TCHAR *pData = TEXT("SOFTWARE\\WOW6432Node\\Microsoft\\Windows\\CurrentVersion\\Run"); long lRet; do { lRet = RegOpenKeyExW(HKEY_CURRENT_USER, pData, 0, KEY_ALL_ACCESS, &hkey); if (lRet != ERROR_SUCCESS) { FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, nullptr, lRet, 0, strErrorMessage, MAXBYTE, nullptr); MessageBox(nullptr, strErrorMessage, L"提示", MB_OK); break; } lRet = RegDeleteValueW(hkey, TEXT("MyAutoRunApplication")); if (lRet != ERROR_SUCCESS) { FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, nullptr, lRet, 0, strErrorMessage, MAXBYTE, nullptr); MessageBox(nullptr, strErrorMessage, L"提示", MB_OK); break; } bRet = true; } while (false); if (hkey) { RegCloseKey(hkey); } system("pause"); return bRet;}
开机自启动注意事项:
我们目前的系统分为64位和32位,也就是之前说的WOW64,也就是32位应用程序和64位应用程序的开机自启动的注册表位置不同。
计算机\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run 64位程序运行的地方
计算机\HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Run 32位程序运行的地方
但是我们也可以通过KEY_WOW64_32KEY (0x0200)或者KEY_WOW64_64KEY (0x0100)来设置运行位置,我们不要这样,因为这样会让我们不知道哪些是32位程序,哪些是64位程序。
- Windows Practice_文件_注册表操作
- Windows Practice_文件_文件基础操作
- Windows Practice_文件_文件分割器(一)
- Windows Practice_文件_文件分割器(二)
- Windows Practice_文件_文件分割器(三)
- Windows Practice_文件搜索器(二)_多线程调试
- Windows Practice_文件搜索器(三)_线程池
- Windows Practice_文件_内存映射(一)
- Windows Practice_内存映射_加载BMP
- Windows Practice_文件搜索器(四)_封装文件扫描器
- Windows Practice_闹钟(一)_简易记事本
- Windows Practice_闹钟(二)_简易记事本
- Windows Practice_闹钟(六)_控件对象
- Windows Practice_文件搜索器(一)递归
- 注册表_操作
- Windows Practice_闹钟(三)_作业讲解和GDI概述
- net 操作Windows注册表
- JAVA操作windows注册表
- 如何隐藏tomcat命令窗口
- 更新weblogic部署包,清理缓存后重启不生效
- 第三题
- 极化码小结
- 45:金币
- Windows Practice_文件_注册表操作
- synchronized锁的原理
- 【shell script】变量及其相关操作
- 简单算法之丢手绢游戏/c++
- 第一周总结----2017.9.10
- eclipse配置apache tomcat运行时访问路径不需要项目名称
- Eclipse中tomcat的相关配置
- 01:与指定数字相同的数的个数
- OpenCV常用API