无法全屏

打包Windows程序,概率性出现无法全屏或分辨率不匹配等问题,使用电视机做显示器比较容易出现这些问题,看注册表就知道了;

修改注册表: HKEY_CURRENT_USER\Software\ [CompanyName] \ [ProductName]

键值:
2024-10-12T07:55:34.png

key type value
Screenmanager Fullscreen mode_h3630240806 REG_DWORD 0:非全屏 /1:全屏
UnityGraphicsQuality_h1669003810 REG_DWORD 0-5:画质等级
UnitySelectMonitor_h17969598 REG_DWORD 1:显示器索引
Screenmanager Resolution Width_h182942802 REG_DWORD 1920:默认是十六进制表示,可以换成十进制
Screenmanager Resolution Height_h2627697771 REG_DWORD 1080:默认是十六进制表示,可以换成十进制

解决

  • 设置 Screenmanager Fullscreen mode_h3630240806 为1
  • 删除 Screenmanager Resolution Width_h182942802Screenmanager Resolution Height_h2627697771

减小出现问题的概率

2024-10-12T07:57:13.png

unity里启动后,删除注册表

 //注册表中屏幕相关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
  }