问题背景:

PC端软件开发,当我在Unity中的PlayerSetting中设置好分辨率,每次打包运行后会记忆上次退出时窗口的分辨率(记忆窗口状态),导致下次打开时不是PlayerSetting中的初始设置,而是读取注册表记录的数据。而我的需求时必须每次进去时都是指定的那个分辨率。

问题纠结点:

1.注册表信息是否可删,怎么获取到删除

2.也不能直接删除整个项目的注册表信息,因为有些数据我们必须记录,所以必须找到具体的KEY.

解决方案:

在软件退出时我们清除注册表中分辨率的指定KEY。

具体过程:

1.查找操作目标:

我们的应用程序记录在: 注册表 ”计算机“ 中的HKEY_CURRENT_USER\Software中,是这样的结构:

HKEY_CURRENT_USER\Software\Company Name\Product Name

通过查找,最后确定在这四项与Screen有关系。我们目标已经找到了,就是操作这四项。

2.获取到该四项,退出时删除该四项。

  //注册表中屏幕相关Key
private readonly string regeditScreenFullscreenModeKey = "Screenmanager Fullscreen mode_h3630240806";
private readonly string regeditScreenResolutionHeightKey = "Screenmanager Resolution Height_h2627697771";
private readonly string regeditScreenResolutionUseNativeKey = "Screenmanager Resolution Use Native_h1405027254";
private readonly string regeditScreenResolutionWidthKey = "Screenmanager Resolution Width_h182942802"; //注册表当前工程项
private StringBuilder regeditPathNode = new StringBuilder(); /// <summary>
/// 初始化
/// </summary>
public void OnSingletonInit()
{
regeditPathNode = regeditPathNode.Append("Software\\").Append(Application.companyName).Append("\\").Append(Application.productName);
} //清空注册表数据
if (Utils.IsJudgeNode(regeditPathNode.ToString()))
{
if (Utils.IsJudgeNodeKey(regeditPathNode.ToString(), regeditScreenFullscreenModeKey))
{
Utils.DeleteNodeKey(regeditPathNode.ToString(), regeditScreenFullscreenModeKey);
}
if (Utils.IsJudgeNodeKey(regeditPathNode.ToString(), regeditScreenResolutionHeightKey))
{
Utils.DeleteNodeKey(regeditPathNode.ToString(), regeditScreenResolutionHeightKey);
}
if (Utils.IsJudgeNodeKey(regeditPathNode.ToString(), regeditScreenResolutionUseNativeKey))
{
Utils.DeleteNodeKey(regeditPathNode.ToString(), regeditScreenResolutionUseNativeKey);
}
if (Utils.IsJudgeNodeKey(regeditPathNode.ToString(), regeditScreenResolutionWidthKey))
{
Utils.DeleteNodeKey(regeditPathNode.ToString(), regeditScreenResolutionWidthKey);
}
}

using Microsoft.Win32;
       using System.Collections.Generic;
       using UnityEngine;

/// <summary>
/// 工具类
/// </summary>
public class Utils
{
#region 公有方法 /// <summary>
/// 判断注册信息节点是否存在
/// </summary>
/// <param name="key">"SOFTWARE\\Microsoft"格式</param>
/// <returns></returns>
public static bool IsJudgeNode(string key)
{
return (Registry.CurrentUser.OpenSubKey(key) != null);
} /// <summary>
/// 判断注册表节点内是否有某个KEY
/// </summary>
/// <param name="key">"SOFTWARE\\Microsoft"格式</param>
/// <param name="prop">传入属性的键值</param>
/// <returns></returns>
public static bool IsJudgeNodeKey(string key, string prop)
{
RegistryKey rsg = Registry.CurrentUser.OpenSubKey(key, true);
if (rsg != null)
{
var obj = rsg.GetValue(prop);
if (obj != null)
{
return true;
}
}
return false;
} /// <summary>
/// 删除指定节点指定键值
/// </summary>
/// <param name="key"></param>
/// <param name="prop"></param>
public static void DeleteNodeKey(string key, string prop)
{
RegistryKey rKey = Registry.CurrentUser;
RegistryKey software = rKey.OpenSubKey(key, true);
//删除
software.DeleteValue(prop);
//完成读取和修改数据后,应关闭该键
software.Close();
} #endregion
}

这个地方使用Registry和 RegistryKey类,这两个类在 using Microsoft.Win32(命名空间提供两种类型的类:处理由操作系统引发的事件的类和操作系统注册表的类。)下,RegistryKey类可以用于完成对注册表的所有操作,Registry是不能实例化的一个类。它的作用只是提供表示顶级键的RegistryKey实例,以便开始在注册表中浏览。Registry是通过静态属性来提供这些实例的,这些属性共有7个,分别是ClassesRoot、CurrentConfig、CurrentUser、DynData、LocalMachine、PerformanceData和 Users。

如何在注册表的给定位置上打开一个注册表项?Registry类没有用户可以使用的公共构造函数,也没有任何可以直接通过键的名称来访问键的方法。但可以在相关的巢中从上至下浏览该键。如果要实例化一个RegistryKey对象,惟一的方式是从Registry的静态属性开始,向下浏览。例如,要读取HKLM/Software/Microsoft键中的一些数据,可以使用下面的代码获得它的一个引用:

 RegistryKey hklm = Registry.LocalMachine;
RegistryKey hkSoftware = hklm.OpenSubKey("Software");
RegistryKey hkMicrosoft = hkSoftware.OpenSubKey("Microsoft");

以上述方式访问注册表项是只读访问。如果要写入该键(包括写入其值,或创建和删除其子键),就需要使用OpenSubKey的另一个重写方法,该方法的第二个参数是bool类型,表示是否要对该键进行读写访问。例如,如果要修改Microsoft键(并假定用户是一个系统管理员,有修改该键的许可),就应编写如下代码:

 RegistryKey hklm = Registry.LocalMachine;
RegistryKey hkSoftware = hklm.OpenSubKey("Software");
RegistryKey hkMicrosoft = hkSoftware.OpenSubKey("Microsoft", true); //创建Key
RegistryKey hkMine = hkSoftware.CreateSubKey("MyOwnSoftware");

CreateSubKey()工作的方式:如果键不存在,它就创建这个键。但如果键已经存在,它就会返回一个表示该键的RegistryKey实例。这个方法采用这样的工作方式的原因是用户总是可以使用这个键。注册表包含长期数据,例如Windows和各种应用程序的配置信息。因此用户并不需要经常显式地创建键。

更常见的是,应用程序需要确保某些数据在注册表中是存在的。换言之,如果这些数据不存在,就要创建相关的键,但如果它们存在,就不需要做任何事。CreateSubKey()就可以完成这项任务。CreateSubKey()不会删除任何数据。如果要删除注册表项,就需要显式调用RegistryKey.Delete()方法,因此注册表对于Windows是非常重要的。如果删除了一些重要的键,就会中断Windows的执行,此时就需要调试C#注册表调用了。

定位了要读取或修改的注册表项后,就可以使用SetValue() 或 GetValue()方法设置或获取该键中的值。这两个方法的参数都是一个字符串,其中字符串给出了值的名称,SetValue()还需要一个包含值的信息的对象引用。这个参数定义为对象引用,实际上可以是任何一个类的引用。SetValue()根据所提供的类的类型,确定把值设置为REG_SZ、REG_DWORD,还是 REG_BINARY。例如:

 RegistryKey hkMine = HkSoftware.CreateSubKey("MyOwnSoftware");
hkMine.SetValue("MyStringValue", "Hello World");
hkMine.SetValue("MyIntValue", );

这段代码设置键包含两个值:MyStringValue的类型是REG_SZ,而MyIntValue的类型是REG_DWORD,这里只考虑这两种类型,在后面的示例中会使用它们。

RegistryKey.GetValue()的工作方式也是这样。它返回一个对象引用,如果该方法检测到值的类型为REG_SZ,就返回一个字符串引用,如果值的类型为REG_DWORD,就返回一个int型值。

但是注意:Unity中写using Microsoft.Win32空间后,如果提示Win32API不存在。

解决方案:

1.右击资源管理器窗口中项目的引用文件夹,选择添加引用,选择.Net选项卡

2.新建VS文件,以DLL库的形式使用。

我这就是使用的dll库形式引用的。到这就解决了上述问题。

ok,欢迎交流指正。

Unity中对注册表进行修改的更多相关文章

  1. 在Unity中对注册表的信息进行操作

      问题1 在对注册表进行操作时无法生成注册表相关的类  解决办法:     增加头文件using Microsft.Win32; 问题2                    在运行程序时报错同时注 ...

  2. asp.net中通过注册表来检测是否安装Office(迅雷/QQ是否已安装)

    原文  asp.net中通过注册表来检测是否安装Office(迅雷/QQ是否已安装) 检测Office是否安装以及获取安装 路径 及安装版本  代码如下 复制代码 #region 检测Office是否 ...

  3. 使用.NET 4.0+ 操作64位系统中的注册表

    一.64位系统中的注册表 以 LocalMachine 中的启动项为例: 64位应用的注册表位置还是在: SOFTWARE\Microsoft\Windows\CurrentVersion\Run 而 ...

  4. 修改注册表来修改IE的设置---资料汇总

    原文链接: http://blog.csdn.net/wangqiulin123456/article/details/17068649 附带批处理执行脚本: @echo off &title ...

  5. 用 C# 在 Windows 7 中写注册表想到的

    摘自:http://blog.163.com/dpj_001/blog/static/2742941520110251500753/ 某日做一个项目,需要在注册表中加入键,同时写值,操作系统环境为 W ...

  6. [No000017F]如何监控注册表的修改

    今天我们将向您展示如何使用我们最喜欢的工具之一Proc Mon,在您更改PC上的组策略设置时查看编辑的注册表项. 使用Proc Mon查看组策略对象修改的注册表设置 您要做的第一件事就是从Sys In ...

  7. Oracle 客户端注册表字符集修改-----解决乱码 .

    本地ORACLE连接创建好后,默认是GBK的字符集,如果连接服务器不是同样的GBK字符集就会出现中文乱码的问题,这种情况我们需要修改本地的字符集来和服务器匹配. 通过注册表修改   HKEY_LOCA ...

  8. Ruby Rails学习中:注册表单,注册失败,注册成功

    接上篇 一. 注册表单 用户资料页面已经可以访问了, 但内容还不完整.下面我们要为网站创建一个注册表单. 1.使用 form_for 注册页面的核心是一个表单, 用于提交注册相关的信息(名字.电子邮件 ...

  9. python 用win32修改注册表,修改打开IE浏览器的配置

    打开注册表:win+r, regedit,注册表的管理是按照文件夹的形式的. 注册表总共有五项: HKEY_CLASSES_ROOT 是HKEY_LOCAL_MACHINE\Software的子项,保 ...

随机推荐

  1. Apache的虚拟主机功能(基于IP、域名、端口号)

    Apache虚拟主机就是在一个Apache服务器上配置多个虚拟主机,实现一个服务器提供多站点服务,其实就是访问同一个服务器上的不同目录. 主要有三种方法: 1.通过不同的IP地址 2.通过不同的域名 ...

  2. 爬虫(三)—— BeautifulSoup模块获取元素

    目录 BeautifulSoup 一.BeautifulSoup简介 二.安装模块 三.解析器 四.Beautiful Soup的使用 五.查找元素 1.遍历文档树 2.搜索文档树 Beautiful ...

  3. apache2.2.25+tomcat7.0.47集群方案

    因为公司项目在线人数的增加,随着现在硬件成本越来越低,大多数的生产环境内存大多都已经达到 16G,尤其最新的阿里云,客户的机器都是配置超高的java主机,但是Java的运行环境,内存使用有限 ,这样就 ...

  4. QT的三种开发方式

    最近在学习QT GUI,单纯使用C++硬编码的方式,直接是采用QWidget部件来做,而不是采用QT Designer做UI界面,也不是采用QML+Javascript.单纯使用C++硬编码的方式,缺 ...

  5. VMware新建虚拟机之后的初始化工作

    一.开启网络功能(后面的ifcfg-ens33自身系统不同) vi /etc/sysconfig/network-scripts/ifcfg-ens33 ONBOOT=yes systemctl re ...

  6. windows下虚拟环境的安装与创建

    使用虚拟环境的好处: 可以方便的解决不同项目对类库的依赖问题. 可以在系统中Python解释器中避免包的混乱和版本的冲突. 为每个程序单独创建虚拟环境,可以保证程序只能访问虚拟环境中的包,保持全局解释 ...

  7. Spring Boot 中 @SpringBootApplication注解背后的三体结构探秘

    概 述 SpringBoot 约定大于配置 的功力让我们如沐春风,在我之前写的文章<从SpringBoot到SpringMVC> 也对比过 SpringBoot 和 SpringMVC 这 ...

  8. android绑定usb前后摄像头

    在Android的系统会有前置摄像头和后置摄像头的定义,摄像头分为SOC类型的摄像头和USB这一类的摄像头,接下要分析就是USB摄像头这一类 . 一般在android或者linux系统中分析一个模块, ...

  9. Codeforces 343D 线段树

    题意:给你一颗以点1为根的数,有两种操作,一种是把x及其子树的所有点都灌满水,一种是把x及其所有祖先都放空水,一种是询问,问某个点里有没有水? 思路:看网上大多数是树剖,但实际上5e5的数据树剖还是有 ...

  10. 125K低频唤醒芯片SI393可替代AS3933,GS3933

    2020年即将推出性能最出色的15–150kHz频率范围.3通道低频唤醒接收器,且具备自动天线调谐功能. SI393是15–150kHz频率范围.3通道低频唤醒接收器,且具备自动天线调谐功能,在软硬件 ...