Flutter 桌面应用开发之读写Windows注册表

文章目录

需求来源

毛玻璃效果配置选项:

WindowEffect.acrylic:Windows 10 1803 及以上版本

WindowEffect.aero:Windows 10 1803以下版本

书接上回,毛玻璃效果配置选项依据Windows的版本号而有所不同,那么如何获取Windows的版本号了?

Windows查询Windows版本号方法

1. 如何查看Windows版本号

要获取Windows版本号,可以按照以下步骤进行操作:

(1)打开"运行"对话框,可以使用快捷键Win + R。

(2)在运行对话框中输入"winver",然后点击"确定"按钮。

(3)弹出的窗口中会显示Windows的版本号和版本信息。

2. Windows开发如何通过代码查询Windows版本号

(1) 使用C#代码:

C 复制代码
using System;
using Microsoft.Win32;
class Program
   {
       static void Main(string[] args)
       {
           string version = string.Empty;
           using (RegistryKey key = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Microsoft\Windows NT\CurrentVersion"))
           {
               if (key != null)
               {
                   version = key.GetValue("CurrentVersion").ToString();
               }
           }
           Console.WriteLine("Windows版本号:" + version);
       }
   }

(2) 使用VB.NET代码

vbnet 复制代码
Imports Microsoft.Win32
Module Module1
      Sub Main()
          Dim version As String = String.Empty
          Using key As RegistryKey = Registry.LocalMachine.OpenSubKey("SOFTWARE\Microsoft\Windows NT\CurrentVersion")
              If key IsNot Nothing Then
                  version = key.GetValue("CurrentVersion").ToString()
              End If
          End Using
          Console.WriteLine("Windows版本号:" & version)
      End Sub
  End Module

通过C#和 .NET获取Windows版本的方法,可以总结出2个关键点:
1. 引入Win32依赖库;
2. 读取注册表信息

3.通过注册表查看Windows版本信息

打开注册表编辑器,输入"计算机\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion",就可以查看版本号信息

Flutter查询Windows版本号方法

Windows原生开发获取版本号的方法为Flutter提供了指导,只要可以找到读写windows注册表,就可以实现版本号的查询。目前,flutter 已经提供了读写windows注册表的依赖库,很方便我们实现相关功能.

依赖库

win32_registry

支持平台

Windows

实现步骤

1. 在pubspec.yaml中添加依赖

dart 复制代码
dependencies:
  ...
  win32_registry: ^1.1.2

2. 获取版本号

dart 复制代码
import 'package:win32_registry/win32_registry.dart';

int? getWindowBuildNumber() {
  const regCurrentVersionKey = r'SOFTWARE\Microsoft\Windows NT\CurrentVersion';
  final key =
      Registry.openPath(RegistryHive.localMachine, path: regCurrentVersionKey);
  final mCurrentVersion = key.getValueAsString('CurrentVersion');
  if (kDebugMode) {
    print("mCurrentVersion:$mCurrentVersion");
  }
  final mUBR = key.getValueAsInt('UBR');
  if (kDebugMode) {
    print("mUBR:$mUBR");
  }
  return mUBR;
}

打印值:

dart 复制代码
flutter: mCurrentVersion:6.3
flutter: mUBR:1081

方法解释

openPath

打开指定的注册表键

dart 复制代码
RegistryKey openPath(
  RegistryHive hive, {
  String path = '',
  AccessRights desiredAccessRights = AccessRights.readOnly,
})

RegistryHive :注册表的入口,

枚举值有localMachine(HKEY_LOCAL_MACHINE),

currentUser(HKEY_CURRENT_USER),

allUsers(HKEY_USERS),

classesRoot(HKEY_CLASSES_ROOT),

currentConfig(HKEY_CURRENT_CONFIG),

performanceData(HKEY_PERFORMANCE_DATA);

除了performanceData以外,其他的值与注册表一级目录一一对应;

path :注冊表的路径
desiredAccessRights :期望权限

readOnly(KEY_READ),

writeOnly(KEY_WRITE),

allAccess(KEY_ALL_ACCESS);

createKey:创建一个新的注册表键

下面是通过注册表添加程序自动启的案例

dart 复制代码
Future<void> updateRegistryTest()  {
  const regCurrentVersionKey = r'Software\Microsoft\Windows\CurrentVersion\Run';
  final key =
  Registry.openPath(RegistryHive.currentUser, path: regCurrentVersionKey,desiredAccessRights: AccessRights.writeOnly);
  key.createKey("WeChat");
  key.createValue(const RegistryValue("WeChat", RegistryValueType.string, "D:\\Program Files (x86)\\Tencent\\WeChat\\WeChat.exe"));
  key.close();
}

创建结果如下:

getValue

查询指定键的值

getValueAsString

查询字符串类型的指定键的值

getValueAsInt

查询Int类型的指定键的值

createValue

设置指定键的值

deleteValue

删除指定键的值

deleteKey

删除指定的注册表键

renameSubkey

更改指定注册表项的名称

注意事项

  1. Unhandled Exception: Error 0x80070005: 拒绝访问
bash 复制代码
[ERROR:flutter/runtime/dart_vm_initializer.cc(41)] Unhandled Exception: Error 0x80070005: 拒绝访问。
#0      Registry.openPath (package:win32_registry/src/registry.dart:56:7)
#1      getWindowBuildNumber (package:window_example/util/window_util.dart:61:16)
#2      showAcrylic (package:window_example/util/window_util.dart:35:22)
#3      _MyHomePageState._init (package:window_example/main.dart:142:5)
<asynchronous suspension>

出现该异常:需要检查路径是否正确,权限参数是否正确;

拓展话题

Windows注册表介绍与操作

相关推荐
恋猫de小郭2 天前
Android 限制侧载新进展,谷歌联合国内厂商推验证计划
android·前端·flutter
恋猫de小郭2 天前
解读 Android 17 全新内存限制,有没有“豁免”后门?
android·前端·flutter
程序员老刘4 天前
跨平台开发地图 | 2026年6月
flutter·ai编程·客户端
悟空瞎说5 天前
Flutter 架构详解:新手必懂底层原理
flutter
SoaringHeart5 天前
Flutter最佳实践:IM聊天文字链接自动识别跳转
前端·flutter
恋猫de小郭5 天前
KMP / CMP 鸿蒙版本 Beta 发布,他有什么特别之处?
android·前端·flutter
qq_369224336 天前
Windows全系通用!ntdll.dll文件丢失、报错、闪退问题的完整排查与修复教程
windows·dll·dll修复·dll丢失·dll错误
阿米亚波6 天前
【Windows】QEMU 启动 openEuler aarch64/arm64 架构系统 + 离线软件源
linux·windows·经验分享·笔记·架构·arm
风华圆舞6 天前
Flutter + 鸿蒙 Intents Kit:页面直达能力的完整接入方案
flutter·ui·华为·harmonyos
韩曙亮6 天前
【Flutter】Flutter 组件 ④ ( 组件渲染 的 三棵树理论 | Widget 树 → Element 树 → RenderObject 树 )
flutter·element·widget·renderobject