Flutter屏幕捕获插件win_capture的使用

Flutter屏幕捕获插件win_capture的使用

此插件用于截取当前屏幕的截图。目前它在macOS和Linux上工作良好,未来我们将支持Windows。

通过原生代码来截取窗口的屏幕截图。这种方法非常快速且响应迅速。 该插件具有在macOS上弹出图标以捕获用户焦点的功能。

开始使用

pubspec.yaml文件中添加依赖项:

dependencies:
  win_capture:
Linux macOS Windows
支持 待定

支持的屏幕捕获和焦点功能

各平台支持的功能如下表所示:

功能 Linux macOS Windows
屏幕捕获 ✔️ ✔️ ❌️
焦点 ❌️ ✔️ ❌️

使用示例

macOS屏幕捕获支持

// 初始化设置
var _winCapture = WinCapture();

// 检查权限
await isAccessAllowed();

// 请求权限
await requestPermission();

// 截取屏幕
await getScreenSnapShot();

macOS焦点支持

// 初始化设置
var _winCapture = WinCapture();

// 弹出窗口检查权限
await popUpWindow();

Linux屏幕捕获支持

对于Linux,我们使用C语言插值使其更本地化和快速。为此,我们创建了一个C库并使用FFI实现它。

// 初始化设置
late WinCapture _winCapture;

[@override](/user/override)
void initState() {
  super.initState();

  _winCapture = WinCapture();
  if (Platform.isLinux) {
    _winCapture.initLinuxSnapLib();
  }
}

void initialSetup() async {
  final getTempPath = await getDownloadsDirectory();
  final Directory appDocDirFolder = Directory(getTempPath!.path);
  if (!await appDocDirFolder.exists()) {
    await appDocDirFolder.create(recursive: true);
  }
  _libPath = appDocDirFolder.path;
  _winCapture.initLinuxSnapLib(_libPath);
  setState(() {});
}

// 截取屏幕
await getScreenSnapShot();

Windows屏幕捕获支持

正在开发中,很快将添加功能。

完整示例代码

以下是一个完整的示例代码,展示了如何使用win_capture插件进行屏幕捕获。

import 'dart:io';
import 'package:flutter/material.dart';
import 'dart:async';
import 'package:flutter/services.dart';
import 'package:path_provider/path_provider.dart';
import 'package:win_capture/win_capture.dart';

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

class MyApp extends StatefulWidget {
  const MyApp({Key? key}) : super(key: key);

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

class _MyAppState extends State<MyApp> {
  late WinCapture _winCapture;
  var _libPath;

  [@override](/user/override)
  void initState() {
    super.initState();
    _winCapture = WinCapture();
    initialSetup();
  }

  void initialSetup() async {
    if (Platform.isMacOS) {
      _winCapture.requestPermission();
    } else if (Platform.isLinux) {
      final getTempPath = await getDownloadsDirectory();
      final Directory appDocDirFolder = Directory(getTempPath!.path);
      if (!await appDocDirFolder.exists()) {
        await appDocDirFolder.create(recursive: true);
      }
      _libPath = appDocDirFolder.path;
      _winCapture.initLinuxSnapLib(_libPath);
    }
    setState(() {});
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text('插件示例应用'),
      ),
      body: Container(
        color: Colors.white,
        width: MediaQuery.of(context).size.width,
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          crossAxisAlignment: CrossAxisAlignment.center,
          children: [
            MaterialButton(
              padding: const EdgeInsets.symmetric(horizontal: 40),
              color: Colors.blue,
              onPressed: () async {
                final Directory appDocDirFolder =
                    Directory('${Directory.current.path}/snapshot');
                if (!await appDocDirFolder.exists()) {
                  await appDocDirFolder.create(recursive: true);
                }
                if (Platform.isMacOS || Platform.isWindows) {
                  var path = await _winCapture.getScreenSnapShot(
                      fileName: "${DateTime.now().millisecondsSinceEpoch}.png",
                      filePath: appDocDirFolder.path);
                  print(path);
                } else {
                  _winCapture.getScreenSnapShot(
                      fileName: "${DateTime.now().millisecondsSinceEpoch}.png",
                      filePath: appDocDirFolder.path,
                      libPath: _libPath);
                }
              },
              child: const Text(
                "截取屏幕",
                style: TextStyle(color: Colors.white),
              ),
            ),
            SizedBox(height: 30),
            MaterialButton(
              padding: const EdgeInsets.symmetric(horizontal: 40),
              color: Colors.blue,
              onPressed: () async {
                _winCapture.popUpWindow().then((value) {
                  print(value);
                });
              },
              child: const Text(
                "弹出窗口",
                style: TextStyle(color: Colors.white),
              ),
            ),
          ],
        ),
      ),
    );
  }
}

更多关于Flutter屏幕捕获插件win_capture的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter屏幕捕获插件win_capture的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


win_capture 是一个适用于 Flutter 的插件,专门用于在 Windows 平台上捕获屏幕内容。它允许你在 Flutter 应用程序中获取屏幕截图或实时屏幕流。以下是如何使用 win_capture 插件的基本步骤:

1. 添加依赖

首先,在你的 pubspec.yaml 文件中添加 win_capture 插件的依赖:

dependencies:
  flutter:
    sdk: flutter
  win_capture: ^1.0.0  # 请使用最新版本

然后运行 flutter pub get 来获取依赖。

2. 初始化插件

在你的 Flutter 应用程序中,首先需要初始化 win_capture 插件。通常,你可以在 main.dart 文件中进行初始化:

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

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  await WinCapture.initialize();
  runApp(MyApp());
}

3. 捕获屏幕截图

win_capture 插件允许你捕获当前屏幕的截图。以下是一个简单的示例,展示如何捕获屏幕截图并将其显示在应用程序中:

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

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: ScreenCapturePage(),
    );
  }
}

class ScreenCapturePage extends StatefulWidget {
  [@override](/user/override)
  _ScreenCapturePageState createState() => _ScreenCapturePageState();
}

class _ScreenCapturePageState extends State<ScreenCapturePage> {
  Uint8List? _imageBytes;

  Future<void> _captureScreen() async {
    try {
      final imageBytes = await WinCapture.captureScreen();
      setState(() {
        _imageBytes = imageBytes;
      });
    } catch (e) {
      print('Failed to capture screen: $e');
    }
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Screen Capture Example'),
      ),
      body: Center(
        child: _imageBytes != null
            ? Image.memory(_imageBytes!)
            : Text('No image captured'),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: _captureScreen,
        child: Icon(Icons.camera_alt),
      ),
    );
  }
}

在这个示例中,当用户点击浮动按钮时,应用程序会捕获当前屏幕的截图,并将其显示在屏幕上。

4. 捕获屏幕流(可选)

win_capture 插件还支持捕获屏幕的实时流。你可以使用 WinCapture.captureScreenStream 方法来获取屏幕的实时流。以下是一个简单的示例:

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

class ScreenStreamPage extends StatefulWidget {
  [@override](/user/override)
  _ScreenStreamPageState createState() => _ScreenStreamPageState();
}

class _ScreenStreamPageState extends State<ScreenStreamPage> {
  Stream<Uint8List>? _screenStream;

  Future<void> _startScreenStream() async {
    try {
      final screenStream = WinCapture.captureScreenStream();
      setState(() {
        _screenStream = screenStream;
      });
    } catch (e) {
      print('Failed to start screen stream: $e');
    }
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Screen Stream Example'),
      ),
      body: Center(
        child: _screenStream != null
            ? StreamBuilder<Uint8List>(
                stream: _screenStream,
                builder: (context, snapshot) {
                  if (snapshot.hasData) {
                    return Image.memory(snapshot.data!);
                  } else {
                    return Text('No stream data');
                  }
                },
              )
            : Text('No stream started'),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: _startScreenStream,
        child: Icon(Icons.play_arrow),
      ),
    );
  }
}
回到顶部