Flutter Windows系统交互插件system_windows的使用

发布于 1周前 作者 vueper 来自 Flutter

Flutter Windows系统交互插件system_windows的使用

system_windows 是一个Flutter插件,它为桌面Flutter应用程序提供了系统托盘菜单的支持。此外,它还可以获取桌面上已打开窗口的列表,适用于MacOS、Windows和Linux系统。

如何使用?

要使用 system_windows 插件,首先需要在 pubspec.yaml 文件中添加依赖项,然后按照以下步骤进行操作:

  1. 安装插件: 在 pubspec.yaml 文件中添加 system_windows 依赖项:

    dependencies:
      flutter:
        sdk: flutter
      system_windows: ^最新版本号
    
  2. 导入插件: 在Dart文件中导入 system_windows 包:

    import 'package:system_windows/system_windows.dart';
    
  3. 获取已打开的应用程序: 使用 SystemWindows 类来获取当前桌面上已打开的应用程序列表:

    var systemWindows = SystemWindows();
    final activeApps = await systemWindows.getActiveApps();
    
  4. 检查屏幕录制权限(仅限MacOS): 如果你使用的是MacOS,可能需要检查是否有屏幕录制权限:

    if (Platform.isMacOS) {
      hasScreenRecordingPermissions = await systemWindows.hasScreenRecordingPermission();
    } else {
      hasScreenRecordingPermissions = true;
    }
    

完整示例代码

以下是一个完整的示例代码,展示了如何使用 system_windows 插件来获取已打开的应用程序,并显示它们的活动情况:

import 'dart:io';
import 'dart:async';

import 'package:flutter/material.dart';
import 'package:system_windows/system_windows.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatefulWidget {
  [@override](/user/override)
  State<MyApp> createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  var systemWindows = SystemWindows();

  var windowsToShow = <Window>[]; // 存储要显示的窗口列表
  var ticks = 0; // 用于记录时间的计数器

  var hasScreenRecordingPermissions = false; // 屏幕录制权限标志

  [@override](/user/override)
  void initState() {
    super.initState();
    _init(); // 初始化数据
  }

  void _init() async {
    Timer.periodic(const Duration(milliseconds: 1000), (timer) async {
      // 每秒获取一次已打开的应用程序
      final activeApps = await systemWindows.getActiveApps();

      // 检查是否有屏幕录制权限(仅限MacOS)
      if (Platform.isMacOS) {
        hasScreenRecordingPermissions = await systemWindows.hasScreenRecordingPermission();
      } else {
        hasScreenRecordingPermissions = true;
      }

      // 将获取到的应用程序转换为 Window 对象
      final wl = activeApps
          .map((w) => Window(w.name, w.title, w.isActive, 0, 0))
          .toList();

      // 如果是第一次获取数据,直接赋值给 windowsToShow
      if (windowsToShow.isEmpty) {
        windowsToShow = wl;
      }

      // 更新每个窗口的活动力度
      for (var element in wl) {
        if (element.isActive) {
          final activeWindow = windowsToShow.firstWhere(
              (window) => window.name == element.name,
              orElse: () => null);

          if (activeWindow != null) {
            activeWindow.previousActivityForce = activeWindow.activityForce;
            activeWindow.activityForce += 100; // 增加活动力度
          }
        }
      }

      // 更新UI
      setState(() {
        ticks += 100;
      });
    });
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      debugShowCheckedModeBanner: false,
      home: Scaffold(
        body: Container(
          margin: EdgeInsets.symmetric(horizontal: 50.0),
          child: Column(
            crossAxisAlignment: CrossAxisAlignment.start,
            children: [
              const SizedBox(height: 30.0),
              Text(
                'system_windows',
                style: TextStyle(fontSize: 28.0),
              ),
              const SizedBox(height: 20.0),
              Text(
                '此插件允许您获取桌面上已打开应用程序的数据,以便实现一些酷炫的功能,就像下面的示例一样 🔥',
                style: TextStyle(fontSize: 18.0, color: Colors.black54),
              ),
              const SizedBox(height: 30.0),
              if (Platform.isMacOS) ...[
                Text(
                  '是否有屏幕录制权限: $hasScreenRecordingPermissions',
                ),
                const SizedBox(height: 30.0),
              ],
              Expanded(
                child: ListView.builder(
                  shrinkWrap: true,
                  itemCount: windowsToShow.length,
                  itemBuilder: (context, index) => Container(
                    margin: EdgeInsets.only(bottom: 20.0),
                    child: Stack(
                      children: [
                        Row(
                          children: [
                            // 使用 TweenAnimationBuilder 动态显示窗口的活动力度
                            TweenAnimationBuilder<int>(
                              tween: IntTween(
                                begin: windowsToShow[index].previousActivityForce,
                                end: windowsToShow[index].activityForce,
                              ),
                              duration: Duration(milliseconds: 1000),
                              builder: (context, value, widget) => Expanded(
                                flex: value,
                                child: Container(
                                  decoration: BoxDecoration(
                                    color: Colors.red,
                                    borderRadius: BorderRadius.circular(4.0),
                                  ),
                                  height: 40.0,
                                ),
                              ),
                            ),
                            TweenAnimationBuilder<int>(
                              tween: IntTween(
                                begin: windowsToShow[index].activityForce,
                                end: ticks - windowsToShow[index].activityForce,
                              ),
                              duration: Duration(milliseconds: 1000),
                              builder: (context, value, widget) => Expanded(
                                flex: value,
                                child: Container(
                                  height: 40,
                                ),
                              ),
                            ),
                          ],
                        ),
                        Padding(
                          padding: EdgeInsets.only(left: 55.0, top: 5.0),
                          child: Column(
                            crossAxisAlignment: CrossAxisAlignment.start,
                            children: [
                              Text("名称: " + windowsToShow[index].name ?? ""),
                              Text("标题: " + windowsToShow[index].title ?? ""),
                            ],
                          ),
                        ),
                      ],
                    ),
                  ),
                ),
              ),
            ],
          ),
        ),
      ),
    );
  }
}

// 定义 Window 类,用于存储窗口信息
class Window {
  Window(
    this.name,
    this.title,
    this.isActive,
    this.activityForce,
    this.previousActivityForce,
  );

  String name; // 窗口名称
  String title; // 窗口标题
  bool isActive; // 是否为活动窗口
  int activityForce; // 窗口的活动力度
  int previousActivityForce; // 上一次的活动力度
}

更多关于Flutter Windows系统交互插件system_windows的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter Windows系统交互插件system_windows的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是如何在Flutter中使用system_windows插件与Windows系统进行交互的示例代码。system_windows插件允许Flutter应用访问一些Windows特定的API和功能。

首先,你需要在你的pubspec.yaml文件中添加system_windows依赖:

dependencies:
  flutter:
    sdk: flutter
  system_windows: ^0.x.x  # 请检查最新版本号

然后运行flutter pub get来安装依赖。

接下来,你需要导入system_windows插件并在你的Flutter代码中调用相关功能。以下是一个简单的示例,展示了如何最小化、最大化和关闭Windows窗口。

import 'package:flutter/material.dart';
import 'package:system_windows/system_windows.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: MyHomePage(),
    );
  }
}

class MyHomePage extends StatefulWidget {
  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  SystemWindows? _systemWindows;

  @override
  void initState() {
    super.initState();
    _systemWindows = SystemWindows();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('System Windows Interaction'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            ElevatedButton(
              onPressed: () async {
                if (await _systemWindows?.minimizeWindow() ?? false) {
                  print('Window minimized');
                } else {
                  print('Failed to minimize window');
                }
              },
              child: Text('Minimize Window'),
            ),
            ElevatedButton(
              onPressed: () async {
                if (await _systemWindows?.maximizeWindow() ?? false) {
                  print('Window maximized');
                } else {
                  print('Failed to maximize window');
                }
              },
              child: Text('Maximize Window'),
            ),
            ElevatedButton(
              onPressed: () async {
                if (await _systemWindows?.closeWindow() ?? false) {
                  print('Window closed');
                  // Note: Closing the window will terminate the Flutter app,
                  // so the following code will not be executed.
                } else {
                  print('Failed to close window');
                }
              },
              child: Text('Close Window'),
            ),
          ],
        ),
      ),
    );
  }
}

在这个示例中,我们创建了一个简单的Flutter应用,其中包含三个按钮,分别用于最小化、最大化和关闭窗口。通过调用_systemWindows对象的相应方法来实现这些功能。

请注意,system_windows插件的功能可能会随着版本的更新而变化,所以请务必查看官方文档以获取最新的API和使用指南。此外,由于system_windows是一个平台特定的插件,它仅在Windows平台上有效,在其他平台上调用这些API将会导致错误或无效操作。

最后,别忘了在构建和运行你的Flutter应用之前,确保你正在Windows平台上进行开发。

回到顶部