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#代码:

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代码

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中添加依赖

dependencies:
  ...
  win32_registry: ^1.1.2

2. 获取版本号

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;
}

打印值:

flutter: mCurrentVersion:6.3
flutter: mUBR:1081

方法解释

openPath

打开指定的注册表键

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:创建一个新的注册表键
下面是通过注册表添加程序自动启的案例

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: 拒绝访问
[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注册表介绍与操作

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: Flutter开发Windows应用是一种跨平台的开发方式,可以让开发者在Windows平台上开发出高质量的应用程序。Flutter提供了一套完整的UI框架和工具,可以帮助开发者快速构建出美观、高效的应用程序。同时,Flutter还支持热重载、动态UI、响应式编程等特性,可以大大提高开发效率和用户体验。如果你想开发Windows应用Flutter是一个不错的选择。 ### 回答2: Flutter是一个崭新的移动应用程序开发框架,它基于Dart开发,并具有独特的自定义窗口渲染引擎,提供了深受开发者喜爱的快速开发能力。目前,Flutter在移动应用开发方面取得了巨大的成功,不过人们也越来越关注Flutter在其他方面的应用场景。 近年来,随着Windows操作系统在不断改进,人们开始注重构建用于Windows平台的高质量应用程序。Flutter社区也已开始把Flutter应用Windows应用程序开发领域。 Flutter应用Windows应用程序开发,不仅可以构建高性能的UI,还可以利用Dart语言以及其他特性,构建兼容WINDOWS的高质量应用程序。另外,Flutter提供的快速开发能力显著减少了开发时间和劳动力成本,使得Flutter成为Windows应用程序开发的必备工具。 对于Windows应用程序开发者而言,Flutter开发环境的搭建非常简单。Flutter提供了一套完整的工具包和API,可通过在Windows操作系统上安装Flutter SDK完成设置。 Flutter开发Windows应用程序的不同之处在于,需要考虑不同平台的兼容性问题,并优化应用程序的UI设计和性能。Flutter提供了许多组件和插件,使开发人员能够轻松地构建不同风格和大小的应用程序。同时,Flutter还提供了组件库和文档,可供开发者使用和参考,以提高开发效率。 总之,Flutter已成为开发人员的首选框架之一,以其高性能、高质量和丰富的UI组件而受到开发者的欢迎。使用Flutter开发Windows应用程序,将是一个高效、优质、灵活和具有前瞻性的选择。 ### 回答3: Flutter是一种跨平台的开源框架,用于构建高性能的移动应用桌面应用和Web应用,具有快速开发、高度可定制化和优秀的用户体验。Flutter的跨平台性使得它成为了同类开源框架中的佼佼者,而且它还提供了很多工具和插件来简化开发过程。 谈到Flutter开发Windows应用,我们可以先从桌面应用的角度出发,Flutter目前支持Windows、Linux和macOS三个桌面平台,并且已经发布了稳定版,可以让开发者开发高性能的桌面应用Flutter开发桌面应用有以下几个好处: 1. Flutter桌面应用采用相同的代码结构和语言,不需要额外的代码重构或额外学习一门语言。 2. Flutter桌面应用的UI控件库相当强大,支持自定义和扩展,可以构建自定义的UI控件。 3. Flutter桌面应用具有良好的跨平台性,开发者可以一份代码适配多个平台,节省开发成本和时间。 4. Flutter桌面应用具有快速的热重载和调试工具,使开发速度更快,效率更高。 在开发Flutter桌面应用之前,我们需要安装Flutter SDK、 Visual Studio Code或Android Studio等开发工具。然后根据官方文档进行环境配置和项目创建,最后就可以使用Flutter的丰富控件来构建Windows应用了。开发者也可以使用第三方库来增强应用的功能和体验,例如窗体管理和应用更新等。 总的来说,Flutter桌面应用是一种快速、高性能、跨平台的开发方式,有着很好的可定制性和用户体验。通过Flutter开发Windows应用,可以为用户带来更好的应用体验,同时为开发者节省了时间和精力。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值