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

1 回复

更多关于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. 处理事件

在上面的代码中,KeyboardHookMouseHook 分别用于监听键盘和鼠标事件。你可以通过设置 onKeyDownonKeyUponMouseMoveonMouseClick 等回调函数来处理这些事件。

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
回到顶部