Windows Practice_文件_注册表操作

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

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值