首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

使用dart:ffi实现winapi(SendInput)

基础概念

Dart:ffi 是 Dart 语言提供的一个库,用于与原生代码进行交互。它允许 Dart 代码调用 C 语言编写的函数,从而可以直接访问操作系统底层 API。

WinAPI (Windows API) 是 Microsoft Windows 操作系统提供的一组函数、宏和数据类型,用于开发 Windows 应用程序。SendInput 是其中的一个函数,用于模拟键盘和鼠标输入。

相关优势

  1. 性能:直接调用原生 API 可以避免 Dart 层面的额外开销,提高性能。
  2. 灵活性:可以访问操作系统提供的所有功能,不受 Dart 标准库的限制。
  3. 兼容性:适用于需要与 Windows 系统深度集成的应用。

类型与应用场景

类型

  • 键盘模拟:模拟按键按下和释放。
  • 鼠标模拟:模拟鼠标移动、点击等操作。

应用场景

  • 自动化测试:模拟用户输入以测试应用程序的响应。
  • 辅助工具:如自动填写表单、游戏辅助等。
  • 系统集成:需要与操作系统底层交互的应用。

示例代码

以下是一个使用 Dart:ffi 调用 SendInput 函数模拟键盘输入的示例:

代码语言:txt
复制
import 'dart:ffi';
import 'dart:io';

void main() {
  final kernel32 = DynamicLibrary.open('kernel32.dll');

  final sendInputPtr = kernel32.lookupFunction<
      Int32 Function(Int32, Pointer<Input>, Int32),
      int Function(int, Pointer<Input>, int)>('SendInput');

  final input = allocate<Input>();
  input.ref.type = INPUT_KEYBOARD;
  input.ref.ki.wVk = 0x41; // 'A' key
  input.ref.ki.dwFlags = KEYEVENTF_KEYDOWN;

  sendInputPtr(1, input, sizeOf<Input>());

  input.ref.ki.dwFlags = KEYEVENTF_KEYUP;
  sendInputPtr(1, input, sizeOf<Input>());

  free(input);
}

class Input extends Struct {
  @Int32('type')
  external int type;

  @Int32('ki.wVk')
  external int wVk;

  @Int32('ki.dwFlags')
  external int dwFlags;
}

const int INPUT_KEYBOARD = 1;
const int KEYEVENTF_KEYDOWN = 0x0000;
const int KEYEVENTF_KEYUP = 0x0002;

可能遇到的问题及解决方法

问题1:无法找到 kernel32.dll

  • 原因:可能是路径问题或系统环境变量未设置。
  • 解决方法:确保 kernel32.dll 在系统路径中,或者使用绝对路径打开库。

问题2:权限不足

  • 原因:某些操作可能需要管理员权限。
  • 解决方法:以管理员身份运行应用程序。

问题3:输入模拟不准确

  • 原因:可能是参数设置不正确或系统安全策略限制。
  • 解决方法:仔细检查 SendInput 的参数设置,并确保没有启用严格的安全策略。

通过以上步骤,你应该能够成功使用 Dart:ffi 调用 WinAPI 中的 SendInput 函数来实现键盘和鼠标输入的模拟。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

  • 在windows下模拟鼠标键盘输入的几种方法 (附带源代码)

    14334.aspx     3 使用mfc的实现方法,最多的,最有名的就是 徐景周 在VCKBase上的那篇 (见 徐景周 的专栏)     4  使用 MS Active Accessibility...接口技术编程     轻量级,重量级,现成的都有了,呵呵         后几种中方法都是使用:SetCursorPos  和 mouse_event WinAPI 来实现的.    ..., 0,0,0,0);     有兴趣的读者可以参考看看上面文章的介绍     本文介绍另外一个办法:     使用: SendInput WinAPI ,这个 方法的介绍如下:  [New for...看来它集成了 键盘按键,鼠标活动,手写板输入等信息,完全可以实现前面提出的需求.  ...配合SendInput使用的还有另外一个结构:  结构:INPUT  [New for Windows NT 4.0 Service Pack 3.]

    8.9K50

    (译)Dart2.12版本发布,可靠的空安全,dart:ffi正式投入生产

    可靠的空安全性使类型系统更加强大,并实现了更好的性能。Dart FFI使您可以使用现有的C库以实现更好的可移植性,并可以选择对性能要求很高的任务使用经过高度调整的C代码。...aNullableInt = null; 空安全性的实现是健壮的,具有丰富的静态流分析功能,使的使用可空类型的工作变得更加容易。...(#35770;但是请注意,您已经可以使用C的终结器) 14.FFI的示例用法 我们已经看到Dart FFI的许多创造性用法,以与各种基于C的API集成。...它使用FFI调用Windows,macOS和Linux上的本机操作系统API。 win32封装了最常见的Win32 API,从而可以直接从Dart调用各种Windows API。...objectbox是由基于C的实现支持的快速数据库。 tflite_flutter使用FFI包装TensorFlow Lite API。 15.Dart语言的下一步是什么?

    2.7K20

    用Go语言写一个Windows的外挂(上)

    ,所以基本处于手生的状态,而 golang 本身也支持使用 syscall 来调用 windows 的 DLL(动态链接库),所以果断使用 golang, 因为这个外挂大部分的WinAPI都在 user32....dll 和 kernel32.dll 里,我们只需要能加载这几个DLL 就可以调用强大的 WinAPI 了 image.png 大家可以使用 PE Explorer 查看一个DLL有哪些输出函数 var...另外值得注意的是,如果我们编译出来的程序是32位的,那么尽量不要用来作为64位程序的外挂,因为有很多复杂一点的功能无法实现,后续会提到这个部分,银企直连 这个服务是32位的,因此我们的go语言也是安装的...API: SendInput, 包括后面的密码输入,也一样要使用这个API 我们看一下这个API的定义 UINT WINAPI SendInput( _In_ UINT nInputs, //...到此为止,关键的技术内容我们已经调研完了,下一篇内容我们会讲如何使用go语言实现一个真正可用的外挂。

    6K20

    Electron中调用DLL

    DLL就要用Node-ffi 因为我是要调用系统的DLL所以主要使用Node-ffi Node-ffi node-ffi是一个用于使用纯JavaScript加载和调用动态库的Node.js插件。...为什么需要使用DLL 需要使用系统 API 操作或扩展应用程序; 需要调用第三方的接口API,特别是与硬件设备进行通信,而这些接口 API 基本上都是通过 C++ 动态链接库(DLL)实现的; 需要调用...安装 node-ffi通过Buffer类,在C代码和JS代码之间实现了内存共享,类型转换则是通过ref、ref-array、ref-struct实现。...`p`,即`p`指向`a` node-ffi实现指针的原理是借助ref,使用Buffer类在C代码和JS代码之间实现了内存共享,让Buffer成为了C语言当中的指针。...WINAPI winapi存在大量的自定义的变量类型,waitingsong大侠的轮子 node-win32-api中完整翻译了全套windef.h中的类型,而且这个项目采用TS来规定FFI的返回Interface

    11.6K41

    【Rust blog】Rust + Flutter 高性能的跨端尝试

    function in Dart 添加依赖 pubspec.yaml -> dev_dependencies: += ffi: ^0.1.3 添加代码 (直接在生成的项目上修改,暂不考虑代码设计问题,...就简简单单的先把项目跑起来 ) import 'dart:ffi'; import 'package:ffi/ffi.dart'; // ... final dylib = Platform.isAndroid...github.com/flutter/flutter/issues/49504#issuecomment-581554697 不要升级到 IOS 13.3.1 系统 What's next 如何高效的实现...Rust & Dart 部分的通信 我们知道 Flutter 和广大 GUI 库类似,属于单线程模型结合事件系统,因此在主线程中使用 FFI 调用 Rust 部分的代码不能阻塞线程。...对 MacOS Windows Linux 桌面端的支持 Flutter 已经有了对桌面端的实验性支持,可以研究下如何结合在一起,实现跨 6 个端共享代码。

    2.2K10

    企业微信超大型工程-跨全平台UI框架最佳实践

    3. dart::ffi 调用 dart 在2.5 之后实现了dart::ffi 来调用c++的接口,并且在flutter上也得到了支持,但是dart::ffi在实践的过程中依然有一些限制条件:  1....的方法来将某个function 的指针传给dart,dart再通过ffi在flutter的ui线程上执行这个function,其中的关系和逻辑相对复杂。...5. ffi接口自动生成与管理 企业微信在2020年下开始使用flutter作为大型独立应用开发,通过dart::ffi 的方式复用了原有底层的service 架构,在一定程度上提高了开发效率,但是在实际开发过程中...,每一次的业务需求都伴随着大量dart::ffi 的胶水代码,并且dart::ffi的方式类似于jni 的开发方式,一方面需要在dart/c++ 写一套中转的胶水代码,另一方面由于dart::ffi 的调用...线程安全,开发者不需要关心flutter 线程与native 主线程的关系 为了解决以上这些问题,我们希望能够更加方便地调用c++的方法,因此参考grpc/trpc 实现了一套dart::ffi的简单的

    4.4K52

    Flutter Web - 优雅的兼容 Flutter App 代码

    那在 Flutter Web 下,继续去使用 MethodChannel 并不合适,官方针对不同平台的适配,也是提供了一种最佳实践,每个功能独立提供自身的实现,让外部使用者无感知。...比如 flutter_svg 在针对 Web 的实现上: export '_file_io.dart' if (dart.library.html) '_file_none.dart'; 就是通过判断是否是...示例代码: 抽象层入口 /// 桥接能力套件 /// /// * 桥定义必传,表示各端都需实现 /// * 桥定义非必传,表示差异化实现,使用前需判断是否支持 class GDBridgeKit {...' if (dart.library.html) '_file_none.dart'; 在 web 中是使用 _file_none.dart 这里面伪造了一个 File 类产生了冲突。...FFI 处理 对于我们项目来说,用到 FFI 的地方都是有 Web 的方式实现了,所以直接屏蔽掉即可。

    1.6K20

    Rust FFI 编程 - FFI 概述

    严格来说,FFI 与 绑定,意义并不相同,绑定可以理解为 FFI 中的一种实现。 不同语言实现 FFI 的方式不尽相同。...有的语言,比如,Rust,要调用 C 库,不再需要使用 C 语言写绑定工程,而是直接使用 Rust 语言写。...大体来说,有如下规范: cdecl syscall optlink pascal register stdcall fastcall thiscall winapi Intel ABI System V...FFI 的困难之处 FFI 实现起来,比想像的要复杂许多,困难体现在: 如果 host 语言(调用主动方)带 GC(垃圾收集器),而 guest 语言(调用被动方)不带,那么可能会在资源管理(创建,释放...所以,虽然都能做 FFI,但是不同语言实现 FFI 的困难程度是不同的。 哪些语言可以方便地对外提供 FFI 库支持 可惜,大部分语言只能单向地“索取”。

    1.1K20

    在windows程序中嵌入Lua脚本引擎--编写自己的Lua库

    在《在windows程序中嵌入Lua脚本引擎--建立一个简易的“云命令”执行的系统》一文中,我提到了使用Lua的ffi库,可以让我们像写C代码一样写lua程序。...但是我们使用ffi库写出来的程序往往比较大,因为我们可能要声明一些API的原型和结构体。比如我们看luajit的wiki中关于使用ffi调用kernel32的一个例子。...看到这,可能会让想使用ffi库的朋友打起了退堂鼓。那我们如何才可以比较简洁的调用这个函数呢?那就是:编写我们自己的Lua库"fl"。          ...而是使用Windows未公开的函数NtQuerySystemInformation。我在之前的《使用APIHOOK实现进程隐藏》中介绍过该方法。...STATUS_SUCCESS 0x00000000 #define STATUS_INFO_LENGTH_MISMATCH ((ULONG)0xC0000004L) typedef DWORD (WINAPI

    2.2K30

    企业微信Flutter与大型Native工程跨四端融合实践

    跨语言通信层:Flutter 作为上层业务开发,需要与原生进行通信,在通信层,主要包含了通过 dart::ffi 直接调用 c++ 底层能力;通过 channel 调用原生的 api 接口,以及通过 socket...1: 如何高效复用 C++统一跨平台能力 dart 2.15 之后提供了 dart::ffi 的方式调用 c/c++ ,在项目的实际开发过程中,我们也遇到一些大型工程下 ffi 的使用问题: 1: dart...因此,在 dart 调用 c++的基础上,我们继续扩展了 dart 调用其他平台接口的能力,并且实现了一套 channel 的自动化框架:rpc-channel,和 pigeon 的主要区别如下: 我们通过...ipc 通信,从上面介绍过 channel 以及 ffi 接口,由于我们对 channel 以及 dart2cpp 的接口进行统一的管理,所有的事件都会经过 stub 类来进行集中处理装包并进行数据的传递...window 降级 view,使用 Flutter 就可以和使用 Control 或者 Widget 一样方便。

    3.2K21
    领券