Flutter全局键盘钩子插件uiohook_dart的使用

Flutter全局键盘钩子插件uiohook_dart的使用

Uiohook

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

开始使用

在纯 Dart 项目中使用 uiohook_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();

模拟鼠标/键盘事件

构造一个 MouseEventData 对象,指定必要的字段和 EventType,然后传递给 sendMouseData 方法。

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

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

其他API

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

请参阅示例以了解各种用法的实际运行示例。

示例代码

import 'package:uiohook_dart/uiohook_dart.dart';

void main(List<String> arguments) async {
  // 初始化 uiohook_dart,使用 uiohook_flutter 包含的预构建二进制文件
  await UioHookDart.init(libuioHookBinary);

  // 打印屏幕数据
  print(await UioHookDart.getScreenData());

  // 处理事件的回调函数
  void handleEvents(HookEvent event) {
    print(event);
    if (event.type == EventType.mouseClicked) {
      // 移动鼠标
      UioHookDart.sendMouseData(
        MouseEventData(x: 500, y: 500),
        EventType.mouseMoved,
      );
    }
  }

  // 拦截事件的回调函数
  bool hookInterceptor(HookEvent event) {
    if (event.type == EventType.keyPressed) {
      return true;
    }
    return false;
  }

  // 开始监听键盘和鼠标事件
  await UioHookDart.startListener(
    onEvents: handleEvents,
    interceptor: hookInterceptor,
    onComplete: (int status) {
      print("StartListener: $status");
    },
  );

  // 等待 10 秒
  await Future.delayed(const Duration(seconds: 10));

  // 停止监听并打印停止状态
  int status = await UioHookDart.stopListener();
  print("StopStatus: $status");

  // 释放资源
  UioHookDart.dispose();
}

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

1 回复

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


uiohook_dart 是一个用于监听全局键盘和鼠标事件的 Flutter 插件。它基于 libuiohook 库,允许你在 Flutter 应用中捕获系统级的键盘和鼠标事件。以下是如何在 Flutter 项目中使用 uiohook_dart 插件的详细步骤。

1. 添加依赖

首先,在 pubspec.yaml 文件中添加 uiohook_dart 依赖:

dependencies:
  flutter:
    sdk: flutter
  uiohook_dart: ^0.1.0

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

2. 导入包

在你的 Dart 文件中导入 uiohook_dart

import 'package:uiohook_dart/uiohook_dart.dart';

3. 初始化钩子

在使用 uiohook_dart 之前,你需要初始化钩子。通常,你可以在 main 函数或 initState 中进行初始化:

void main() {
  UioHook.init();
  runApp(MyApp());
}

4. 监听键盘事件

你可以使用 UioHook.onKeyEvent 来监听键盘事件。以下是一个简单的例子,展示如何监听按键事件:

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

void main() {
  UioHook.init();
  runApp(MyApp());
}

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

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

class _KeyboardListenerExampleState extends State<KeyboardListenerExample> {
  String _keyEvents = '';

  [@override](/user/override)
  void initState() {
    super.initState();
    UioHook.onKeyEvent((event) {
      setState(() {
        _keyEvents += 'Key ${event.keyCode} ${event.isPressed ? 'pressed' : 'released'}\n';
      });
    });
  }

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

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Global Keyboard Hook Example'),
      ),
      body: SingleChildScrollView(
        child: Padding(
          padding: const EdgeInsets.all(16.0),
          child: Text(_keyEvents),
        ),
      ),
    );
  }
}

5. 处理鼠标事件

类似地,你可以使用 UioHook.onMouseEvent 来监听鼠标事件:

UioHook.onMouseEvent((event) {
  print('Mouse event: ${event.x}, ${event.y}');
});

6. 清理钩子

在应用退出或不再需要监听事件时,记得清理钩子:

[@override](/user/override)
void dispose() {
  UioHook.dispose();
  super.dispose();
}
回到顶部