Flutter全局键盘和鼠标钩子插件uiohook_flutter的使用

Flutter全局键盘和鼠标钩子插件uiohook_flutter的使用

Uiohook

跨平台桌面键盘和鼠标钩子库,基于 libuiohook 的 FFI 实现。

入门指南

使用 uiohook_dart 进行纯 Dart 项目,要在 Flutter 项目中使用也需要添加 uiohook_flutter

uiohook_flutter 只包含预构建的 libuiohook 二进制文件,并提供一个 libuioHookBinary 变量,可以用于初始化 UiohookDart

使用方法

初始化

首先需要使用 libuiohook 二进制文件进行初始化,或者使用 uiohook_flutter 自动包含预构建的二进制文件。

// 获取二进制路径,可以使用 `uiohook_flutter` 或者包含自己的二进制文件
UioHookDart.init(libuioHookBinary);

完成操作后释放资源:

UioHookDart.dispose();
开始监听

开始监听鼠标和键盘事件,并在 onComplete 回调中获取结果。为了获取事件,有两种回调方式:

  • interceptor 会直接从隔离区获取事件,不会与应用程序共享内存。如果要抑制事件则返回 true,否则返回 false
  • onEvents 也会提供 hookEvents,但会在主线程上提供,可以根据事件执行任务。
UioHookDart.startListener(
    interceptor: (HookEvent event) {
      // 抑制键盘按下事件
      if (event.type == EventType.keyPressed) {
        return true;
      }
      // 传递其他事件
      return false;
    },
    onEvents: (HookEvent event) {
      // 使用鼠标和键盘事件
    },
    onComplete: (int status) {
        print("StartListener: $status");
    },
);
停止监听

如果监听器已经启动,则调用 stopListener 将触发 startListeneronComplete 回调并返回结果。

UioHookDart.stopListener();
获取屏幕信息

获取有关屏幕及其外部连接显示器的信息。

UioHookDart.getScreenData();
模拟鼠标/键盘事件

使用所需的字段构造 MouseEventDataEventType,然后传递给 sendMouseData

UioHookDart.sendMouseData(
    MouseEventData(x: 500, y: 500),
    EventType.mouseMoved,
);

同样可以使用 sendKeyboardData 发送键盘数据,使用 sendMouseWheelData 发送滚动事件。

其他API

  • 使用 getKeyboardAutoRepeatRate 获取键盘自动重复速率。
  • 使用 getKeyboardAutoRepeatDelay 获取键盘自动重复延迟。
  • 使用 getPointerAccelerationMultiplier 获取鼠标加速倍率。
  • 使用 getPointerSensitivity 获取鼠标灵敏度。
  • 使用 getMultiClickTime 获取双击/三击间隔。
  • 使用 hookGetPointerAccelerationThreshold 获取鼠标加速阈值。

完整示例Demo

以下是完整的示例代码,展示了如何使用 uiohook_flutter 插件来监听键盘和鼠标事件。

// ignore_for_file: avoid_print

import 'package:flutter/material.dart';
import 'package:uiohook_dart/uiohook_dart.dart';
import 'package:uiohook_flutter/uiohook_flutter.dart';

void main() {
  WidgetsFlutterBinding.ensureInitialized();
  runApp(const MyApp());
}

class MyApp extends StatefulWidget {
  const MyApp({super.key});

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

class _MyAppState extends State<MyApp> {
  // 抑制事件时返回True
  HookInterceptor interceptor = (HookEvent event) {
    if (event.type == EventType.keyPressed) {
      return true;
    }
    return false;
  };

  HookListener handleEvents = (HookEvent event) {
    print(event.toString());
    // 按下ESC键时停止监听
    if (event.keyboardEventData?.keycode == HookConstants.VC_ESCAPE) {
      UioHookDart.stopListener();
    }
    // 单击时将鼠标移动到指定位置
    if (event.type == EventType.mouseClicked) {
      //  _uiohookDartPlugin.sendMouseData(MouseEventData(x: 500, y: 500), EventType.mouseMoved);
    }
  };

  [@override](/user/override)
  void initState() {
    UioHookDart.init(libuioHookBinary);
    super.initState();
  }

  [@override](/user/override)
  void dispose() {
    UioHookDart.dispose();
    super.dispose();
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      debugShowCheckedModeBanner: false,
      home: Scaffold(
        appBar: AppBar(
          title: const Text('Uiohook'),
          elevation: 4,
        ),
        body: Center(
          child: Column(
            children: [
              const SizedBox(height: 10),
              Row(
                mainAxisAlignment: MainAxisAlignment.spaceAround,
                children: [
                  ElevatedButton(
                    onPressed: () async {
                      await UioHookDart.startListener(
                        interceptor: interceptor,
                        onEvents: handleEvents,
                        onComplete: (int status) {
                          print("StartListener: $status");
                        },
                      );
                    },
                    child: const Text("Start"),
                  ),
                  ElevatedButton(
                    onPressed: () async {
                      final result = await UioHookDart.stopListener();
                      print("StopListener $result");
                    },
                    child: const Text("Stop"),
                  ),
                ],
              ),
              const Divider(),
              const Text("Properties"),
              const Divider(),
              Row(
                mainAxisAlignment: MainAxisAlignment.spaceAround,
                children: [
                  ElevatedButton(
                    onPressed: () async {
                      print(await UioHookDart.getScreenData());
                    },
                    child: const Text("Screen Data"),
                  ),
                  ElevatedButton(
                    onPressed: () async {
                      print(
                        await UioHookDart.getKeyboardAutoRepeatRate(),
                      );
                    },
                    child: const Text("Keyboard Repeat Rate"),
                  ),
                ],
              ),
              const SizedBox(height: 20),
              Row(
                mainAxisAlignment: MainAxisAlignment.spaceAround,
                children: [
                  ElevatedButton(
                    onPressed: () async {
                      print(
                        await UioHookDart.getKeyboardAutoRepeatDelay(),
                      );
                    },
                    child: const Text("Keyboard Repeat delay"),
                  ),
                  ElevatedButton(
                    onPressed: () async {
                      print(
                        await UioHookDart.getPointerAccelerationMultiplier(),
                      );
                    },
                    child: const Text("Mouse threshold"),
                  ),
                ],
              ),
              const SizedBox(height: 20),
              Row(
                mainAxisAlignment: MainAxisAlignment.spaceAround,
                children: [
                  ElevatedButton(
                    onPressed: () async {
                      print(
                        await UioHookDart.getPointerSensitivity(),
                      );
                    },
                    child: const Text("Mouse sensitivity"),
                  ),
                  ElevatedButton(
                    onPressed: () async {
                      print(
                        await UioHookDart.getMultiClickTime(),
                      );
                    },
                    child: const Text("Click interval"),
                  ),
                ],
              ),
            ],
          ),
        ),
      ),
    );
  }
}

更多关于Flutter全局键盘和鼠标钩子插件uiohook_flutter的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter全局键盘和鼠标钩子插件uiohook_flutter的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


uiohook_flutter 是一个 Flutter 插件,它允许你在 Flutter 应用中全局监听键盘和鼠标事件。这个插件基于 uiohook 库,提供了跨平台的支持,可以在 Windows、macOS 和 Linux 上使用。

安装

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

dependencies:
  flutter:
    sdk: flutter
  uiohook_flutter: ^1.0.0

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

基本使用

1. 初始化

在使用 uiohook_flutter 之前,你需要先初始化它。通常在 main.dart 文件中进行初始化:

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

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

2. 监听键盘和鼠标事件

你可以通过 UioHookFlutter 提供的 onKeyEventonMouseEvent 来监听全局的键盘和鼠标事件。

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

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

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

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

class _MyHomePageState extends State<MyHomePage> {
  [@override](/user/override)
  void initState() {
    super.initState();
    UioHookFlutter.onKeyEvent.listen((event) {
      print('Key event: $event');
    });

    UioHookFlutter.onMouseEvent.listen((event) {
      print('Mouse event: $event');
    });
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('UioHook Flutter Example'),
      ),
      body: Center(
        child: Text('Press any key or move the mouse'),
      ),
    );
  }
}

3. 停止监听

如果你不再需要监听事件,可以取消订阅:

StreamSubscription<KeyEvent>? _keyEventSubscription;
StreamSubscription<MouseEvent>? _mouseEventSubscription;

[@override](/user/override)
void initState() {
  super.initState();
  _keyEventSubscription = UioHookFlutter.onKeyEvent.listen((event) {
    print('Key event: $event');
  });

  _mouseEventSubscription = UioHookFlutter.onMouseEvent.listen((event) {
    print('Mouse event: $event');
  });
}

[@override](/user/override)
void dispose() {
  _keyEventSubscription?.cancel();
  _mouseEventSubscription?.cancel();
  super.dispose();
}
回到顶部