【发布时间】:2020-04-09 01:12:52
【问题描述】:
我正在尝试使用 ffi 在 dart 中实现 SendInput 函数。 它需要一个无符号整数、一个输入数组和一个整数。 我发现很难实现 INPUT 数组结构,这是我到目前为止所做的:
import 'dart:ffi';
import 'package:ffi/ffi.dart';
import 'user32.dart'; //import dylib
typedef SendInputC = Uint32 Function(
Uint32 cInputs, Pointer pInputs, Int32 cbSize);
typedef SendInputDart = int Function(int inputCount, Pointer inputs, int size);
int SendInput(int type, {MouseInput mi, KeyboardInput ki, HardwareInput hi}) {
final SendInputP =
dylib.lookupFunction<SendInputC, SendInputDart>('SendInput');
var input = Input.allocate(
type: type,
mi: mi?.addressOf ?? nullptr,
ki: ki?.addressOf ?? nullptr,
hi: hi?.addressOf ?? nullptr);
var result = SendInputP(1, input.addressOf, sizeOf<Input>());
return result;
}
class Input extends Struct {
@Uint32()
int type;
Pointer<MouseInput> mi;
Pointer<KeyboardInput> ki;
Pointer<HardwareInput> hi;
factory Input.allocate(
{int type,
Pointer<MouseInput> mi,
Pointer<KeyboardInput> ki,
Pointer<HardwareInput> hi}) =>
allocate<Input>().ref
..type = type
..mi = mi
..ki = ki
..hi = hi;
}
/// MouseInput struct
class MouseInput extends Struct {
@Int32()
int dx;
@Int32()
int dy;
@Uint32()
int mouseData;
@Uint32()
int dwFlags;
@Uint32()
int time;
@Uint32()
int dwExtraInfo;
factory MouseInput.allocate(
{int dx = 0,
int dy = 0,
int mouseData = 0,
int dwFlags = 0,
int time = 0,
int dwExtraInfo = 0}) =>
allocate<MouseInput>().ref
..dx = dx
..dy = dy
..mouseData = mouseData
..dwFlags = dwFlags
..time = time
..dwExtraInfo = dwExtraInfo;
}
class KeyboardInput extends Struct {
@Uint16()
int wVk;
@Uint16()
int wScan;
@Uint32()
int dwFlags;
@Uint32()
int time;
@Uint32()
int dwExtraInfo;
factory KeyboardInput.allocate(
{int wVk = 0,
int wScan = 0,
int dwFlags = 0,
int time = 0,
int dwExtraInfo = 0}) =>
allocate<KeyboardInput>().ref
..wVk = wVk
..wScan = wScan
..dwFlags = dwFlags
..time = time
..dwExtraInfo = dwExtraInfo;
}
class HardwareInput extends Struct {
@Uint32()
int uMsg;
@Uint16()
int wParamL;
@Uint16()
int wParamH;
factory HardwareInput.allocate(
{int uMsg = 0, int wParamL = 0, int wParamH = 0}) =>
allocate<HardwareInput>().ref
..uMsg = uMsg
..wParamL = wParamL
..wParamH = wParamH;
}
但是调用SendInput函数没有任何效果,返回0,例如这段代码没有发送鼠标输入。
var mi = MouseInput.allocate(dx: 505, dy: 175, dwFlags: 0x0002);
var r = SendInput(0, mi: mi);
这是函数在 C++ 中的样子
INPUT input;
input.type = INPUT_MOUSE;
input.mi.dx = 505;
input.mi.dy = 175;
input.mi.dwFlags = MOUSEEVENTF_LEFTDOWN;
input.mi.dwExtraInfo = 0;
input.mi.time = 0;
SendInput(1, &input, sizeof(input));
tagInput 结构包含似乎尚不支持的联合 (https://github.com/dart-lang/sdk/issues/38491),但我想知道在支持联合之前是否有解决方法。
【问题讨论】: