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位程序。