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

原创粉丝点击