Flutter Windows平台钩子插件win32hooks的使用
Flutter Windows平台钩子插件win32hooks的使用
win32hooks
一个用于跟踪鼠标按钮和Windows事件的Windows Flutter插件。
示例输出:
flutter: WinEventInfo: EventStruct(event: 10, hWnd: 262318, idObject: 0, idChild: 0, dwEventThread: 11296, dwmsEventTime: 183474890)
flutter: WinEventInfo: EventStruct(event: 11, hWnd: 262318, idObject: 0, idChild: 0, dwEventThread: 11296, dwmsEventTime: 183474968)
flutter: MouseInfo: MouseStruct(button: MouseButtons.Button4, down: true, up: false, type: MouseEvent.control)
flutter: MouseInfo: MouseStruct(button: MouseButtons.Button4, down: false, up: true, type: MouseEvent.control)
开始使用
这还不是完全完成的版本,但如果你不想调试Windows API,它已经足够使用了。
简单示例
// 在任何类之外:
final winHooks = WinHooks(); // 全局变量。
class _MyAppState extends State<MyApp> with WinHookEventListener {
[@override](/user/override)
void initState() {
super.initState();
initialState();
}
Future<void> initialState() async {
if (!mounted) return;
// 对于onMouseInfoReceived和onWinEventInfoReceived
winHooks.addListener(this);
/// 清理cpp内存中的鼠标按钮和dart事件变量
/// 当你重新加载或热重载应用时,如果在期间更改了按钮,这将非常有用。
winHooks.cleanHooks();
/// 参数是自解释的。
winHooks.setWinEventParameters(minEvent: WinHookEvent.SYSTEM_MOVESIZESTART, maxEvent: WinHookEvent.SYSTEM_MOVESIZEEND, reinstallHooks: false);
/// [MouseEvent.control] 用于阻止该按钮的传播
/// [MouseEvent.watch] 仅用于接收按下按钮时的回调。
winHooks.addMouseHook(button: MouseButtons.Button4, mouseEvent: MouseEvent.control, reinstallHooks: false);
/// 初始化cpp调用。
winHooks.installWinHook();
setState(() {});
}
/**
MouseStruct {
MouseButtons button;
bool down = false;
bool up = false;
MouseEvent type;
}
MouseButtons {
Left,
Right,
Middle,
ScrollUp,
ScrollDown,
Button3,
Button4,
}
enum MouseEvent { control, watch }
*/
[@override](/user/override)
void onMouseInfoReceived(MouseStruct mouse) {
print("MouseInfo: ${mouse.toString()}");
}
/**
int event = 0;
int hWnd = 0;
int idObject = 0;
int idChild = 0;
int dwEventThread = 0;
int dwmsEventTime = 0;
*/
[@override](/user/override)
void onWinEventInfoReceived(WinEventStruct event) {
print("WinEventInfo: ${event.toString()}");
}
}
完整示例代码
example/lib/main.dart
import 'package:flutter/material.dart';
import 'package:win32hooks/const.win.dart';
import 'dart:async';
import 'package:win32hooks/win32hooks.dart';
final winHooks = WinHooks();
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> with WinHookEventListener {
[@override](/user/override)
void initState() {
super.initState();
initialState();
}
Future<void> initialState() async {
if (!mounted) return;
//winHooks.uninstallWinHook();
winHooks.addListener(this);
winHooks.cleanHooks();
winHooks.setWinEventParameters(minEvent: WinHookEvent.SYSTEM_MOVESIZESTART, maxEvent: WinHookEvent.SYSTEM_MOVESIZEEND, reinstallHooks: false);
winHooks.addMouseHook(button: MouseButtons.Button4, mouseEvent: MouseEvent.control, reinstallHooks: false);
winHooks.installWinHook();
setState(() {});
}
[@override](/user/override)
void onMouseInfoReceived(MouseStruct mouse) {
print("MouseInfo: ${mouse.toString()}");
}
[@override](/user/override)
void onWinEventInfoReceived(WinEventStruct event) {
print("WinEventInfo: ${event.toString()}");
}
[@override](/user/override)
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
body: Center(
child: Column(
children: [
const Divider(height: 10, thickness: 10, color: Colors.transparent),
OutlinedButton(
child: const Text('安装WinHooks'),
onPressed: () async {
await winHooks.installWinHook();
setState(() {});
},
),
const Divider(
height: 10,
thickness: 10,
color: Colors.transparent,
),
OutlinedButton(
child: const Text('卸载钩子'),
onPressed: () {
winHooks.uninstallWinHook();
},
),
Text("${winHooks.hookMouseID} : ${winHooks.hookEventID}"),
const SizedBox(height: 10),
// 插入富文本区域
],
),
),
),
);
}
}
更多关于Flutter Windows平台钩子插件win32hooks的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter Windows平台钩子插件win32hooks的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
在 Flutter 中,win32hooks
是一个用于在 Windows 平台上捕获和处理系统级事件的插件。它允许你监听键盘、鼠标等输入事件,并对其进行自定义处理。以下是如何在 Flutter 项目中使用 win32hooks
插件的基本步骤:
1. 添加依赖
首先,你需要在 pubspec.yaml
文件中添加 win32hooks
插件的依赖:
dependencies:
flutter:
sdk: flutter
win32hooks: ^1.0.0 # 请确保使用最新版本
然后运行 flutter pub get
来获取依赖。
2. 初始化钩子
在 Flutter 应用程序中,你可以通过初始化钩子来开始监听事件。通常,你可以在 main.dart
中初始化钩子。
import 'package:flutter/material.dart';
import 'package:win32hooks/win32hooks.dart';
void main() {
runApp(MyApp());
initHooks();
}
void initHooks() {
// 初始化键盘钩子
KeyboardHook keyboardHook = KeyboardHook();
keyboardHook.onKeyDown = (int keyCode) {
print('Key down: $keyCode');
};
keyboardHook.onKeyUp = (int keyCode) {
print('Key up: $keyCode');
};
// 初始化鼠标钩子
MouseHook mouseHook = MouseHook();
mouseHook.onMouseMove = (int x, int y) {
print('Mouse moved to ($x, $y)');
};
mouseHook.onMouseClick = (int button) {
print('Mouse button clicked: $button');
};
// 启动钩子
keyboardHook.start();
mouseHook.start();
}
3. 处理事件
在上面的代码中,KeyboardHook
和 MouseHook
分别用于监听键盘和鼠标事件。你可以通过设置 onKeyDown
、onKeyUp
、onMouseMove
和 onMouseClick
等回调函数来处理这些事件。
4. 停止钩子
当你不再需要监听事件时,可以停止钩子以释放资源。
void stopHooks() {
keyboardHook.stop();
mouseHook.stop();
}
5. 注意事项
win32hooks
插件只能在 Windows 平台上使用,因此在其他平台上运行时需要做好平台判断。- 由于
win32hooks
是一个系统级钩子,使用不当可能会影响系统性能或导致意外行为,因此请谨慎使用。
6. 示例应用
以下是一个简单的 Flutter 应用示例,它使用 win32hooks
来监听键盘和鼠标事件:
import 'package:flutter/material.dart';
import 'package:win32hooks/win32hooks.dart';
void main() {
runApp(MyApp());
initHooks();
}
void initHooks() {
KeyboardHook keyboardHook = KeyboardHook();
keyboardHook.onKeyDown = (int keyCode) {
print('Key down: $keyCode');
};
keyboardHook.onKeyUp = (int keyCode) {
print('Key up: $keyCode');
};
MouseHook mouseHook = MouseHook();
mouseHook.onMouseMove = (int x, int y) {
print('Mouse moved to ($x, $y)');
};
mouseHook.onMouseClick = (int button) {
print('Mouse button clicked: $button');
};
keyboardHook.start();
mouseHook.start();
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(
title: Text('Win32 Hooks Example'),
),
body: Center(
child: Text('Listening for keyboard and mouse events...'),
),
),
);
}
}
7. 进一步学习
你可以通过查阅 win32hooks
插件的官方文档和源代码来了解更多高级用法和自定义选项。
https://pub.dev/packages/win32hooks