PC端軟件開發,當我在Unity中的PlayerSetting中設置好分辨率,每次打包運行後會記憶上次退出時窗口的分辨率(記憶窗口狀態),致使下次打開時不是PlayerSetting中的初始設置,而是讀取註冊表記錄的數據。而個人需求時必須每次進去時都是指定的那個分辨率。ide
1.註冊表信息是否可刪,怎麼獲取到刪除函數
2.也不能直接刪除整個項目的註冊表信息,由於有些數據咱們必須記錄,因此必須找到具體的KEY.工具
在軟件退出時咱們清除註冊表中分辨率的指定KEY。ui
1.查找操做目標:spa
咱們的應用程序記錄在: 註冊表 」計算機「 中的HKEY_CURRENT_USER\Software中,是這樣的結構:操作系統
HKEY_CURRENT_USER\Software\Company Name\Product Name3d
經過查找,最後肯定在這四項與Screen有關係。咱們目標已經找到了,就是操做這四項。調試
2.獲取到該四項,退出時刪除該四項。code
1 //註冊表中屏幕相關Key 2 private readonly string regeditScreenFullscreenModeKey = "Screenmanager Fullscreen mode_h3630240806"; 3 private readonly string regeditScreenResolutionHeightKey = "Screenmanager Resolution Height_h2627697771"; 4 private readonly string regeditScreenResolutionUseNativeKey = "Screenmanager Resolution Use Native_h1405027254"; 5 private readonly string regeditScreenResolutionWidthKey = "Screenmanager Resolution Width_h182942802"; 6 7 //註冊表當前工程項 8 private StringBuilder regeditPathNode = new StringBuilder(); 9 10 /// <summary> 11 /// 初始化 12 /// </summary> 13 public void OnSingletonInit() 14 { 15 regeditPathNode = regeditPathNode.Append("Software\\").Append(Application.companyName).Append("\\").Append(Application.productName); 16 } 17 18 //清空註冊表數據 19 if (Utils.IsJudgeNode(regeditPathNode.ToString())) 20 { 21 if (Utils.IsJudgeNodeKey(regeditPathNode.ToString(), regeditScreenFullscreenModeKey)) 22 { 23 Utils.DeleteNodeKey(regeditPathNode.ToString(), regeditScreenFullscreenModeKey); 24 } 25 if (Utils.IsJudgeNodeKey(regeditPathNode.ToString(), regeditScreenResolutionHeightKey)) 26 { 27 Utils.DeleteNodeKey(regeditPathNode.ToString(), regeditScreenResolutionHeightKey); 28 } 29 if (Utils.IsJudgeNodeKey(regeditPathNode.ToString(), regeditScreenResolutionUseNativeKey)) 30 { 31 Utils.DeleteNodeKey(regeditPathNode.ToString(), regeditScreenResolutionUseNativeKey); 32 } 33 if (Utils.IsJudgeNodeKey(regeditPathNode.ToString(), regeditScreenResolutionWidthKey)) 34 { 35 Utils.DeleteNodeKey(regeditPathNode.ToString(), regeditScreenResolutionWidthKey); 36 } 37 }
using Microsoft.Win32;
using System.Collections.Generic;
using UnityEngine;orm
/// <summary> 2 /// 工具類 3 /// </summary> 4 public class Utils 5 { 6 #region 公有方法 7 8 /// <summary> 9 /// 判斷註冊信息節點是否存在 10 /// </summary> 11 /// <param name="key">"SOFTWARE\\Microsoft"格式</param> 12 /// <returns></returns> 13 public static bool IsJudgeNode(string key) 14 { 15 return (Registry.CurrentUser.OpenSubKey(key) != null); 16 } 17 18 /// <summary> 19 /// 判斷註冊表節點內是否有某個KEY 20 /// </summary> 21 /// <param name="key">"SOFTWARE\\Microsoft"格式</param> 22 /// <param name="prop">傳入屬性的鍵值</param> 23 /// <returns></returns> 24 public static bool IsJudgeNodeKey(string key, string prop) 25 { 26 RegistryKey rsg = Registry.CurrentUser.OpenSubKey(key, true); 27 if (rsg != null) 28 { 29 var obj = rsg.GetValue(prop); 30 if (obj != null) 31 { 32 return true; 33 } 34 } 35 return false; 36 } 37 38 /// <summary> 39 /// 刪除指定節點指定鍵值 40 /// </summary> 41 /// <param name="key"></param> 42 /// <param name="prop"></param> 43 public static void DeleteNodeKey(string key, string prop) 44 { 45 RegistryKey rKey = Registry.CurrentUser; 46 RegistryKey software = rKey.OpenSubKey(key, true); 47 //刪除 48 software.DeleteValue(prop); 49 //完成讀取和修改數據後,應關閉該鍵 50 software.Close(); 51 } 52 53 #endregion 54 }
這個地方使用Registry和 RegistryKey類,這兩個類在 using Microsoft.Win32(命名空間提供兩種類型的類:處理由操做系統引起的事件的類和操做系統註冊表的類。)下,RegistryKey類能夠用於完成對註冊表的全部操做,Registry是不能實例化的一個類。它的做用只是提供表示頂級鍵的RegistryKey實例,以便開始在註冊表中瀏覽。Registry是經過靜態屬性來提供這些實例的,這些屬性共有7個,分別是ClassesRoot、CurrentConfig、CurrentUser、DynData、LocalMachine、PerformanceData和 Users。
如何在註冊表的給定位置上打開一個註冊表項?Registry類沒有用戶可使用的公共構造函數,也沒有任何能夠直接經過鍵的名稱來訪問鍵的方法。但能夠在相關的巢中從上至下瀏覽該鍵。若是要實例化一個RegistryKey對象,唯一的方式是從Registry的靜態屬性開始,向下瀏覽。例如,要讀取HKLM/Software/Microsoft鍵中的一些數據,可使用下面的代碼得到它的一個引用:
1 RegistryKey hklm = Registry.LocalMachine; 2 RegistryKey hkSoftware = hklm.OpenSubKey("Software"); 3 RegistryKey hkMicrosoft = hkSoftware.OpenSubKey("Microsoft");
以上述方式訪問註冊表項是隻讀訪問。若是要寫入該鍵(包括寫入其值,或建立和刪除其子鍵),就須要使用OpenSubKey的另外一個重寫方法,該方法的第二個參數是bool類型,表示是否要對該鍵進行讀寫訪問。例如,若是要修改Microsoft鍵(並假定用戶是一個系統管理員,有修改該鍵的許可),就應編寫以下代碼:
1 RegistryKey hklm = Registry.LocalMachine; 2 RegistryKey hkSoftware = hklm.OpenSubKey("Software"); 3 RegistryKey hkMicrosoft = hkSoftware.OpenSubKey("Microsoft", true); 4 5 6 //建立Key 7 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。例如:
1 RegistryKey hkMine = HkSoftware.CreateSubKey("MyOwnSoftware"); 2 hkMine.SetValue("MyStringValue", "Hello World"); 3 hkMine.SetValue("MyIntValue", 20);
這段代碼設置鍵包含兩個值: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,歡迎交流指正。