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
将触发 startListener
的 onComplete
回调并返回结果。
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
获取鼠标加速阈值。
完整示例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
更多关于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
提供的 onKeyEvent
和 onMouseEvent
来监听全局的键盘和鼠标事件。
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();
}