Ruby 通过win32API调用SendInput时,这些额外参数是什么
我对使用win32API通过Ruby发送密钥输入感兴趣。 我已找到要调用的函数: MSDN对签名的描述如下:Ruby 通过win32API调用SendInput时,这些额外参数是什么,ruby,winapi,struct,msdn,Ruby,Winapi,Struct,Msdn,我对使用win32API通过Ruby发送密钥输入感兴趣。 我已找到要调用的函数: MSDN对签名的描述如下: UINT WINAPI SendInput( _In_ UINT nInputs, _In_ LPINPUT pInputs, _In_ int cbSize ); 输入看起来像 typedef struct tagINPUT { DWORD type; union { MOUSEINPUT mi; KEYBDINPUT ki;
UINT WINAPI SendInput(
_In_ UINT nInputs,
_In_ LPINPUT pInputs,
_In_ int cbSize
);
输入看起来像
typedef struct tagINPUT {
DWORD type;
union {
MOUSEINPUT mi;
KEYBDINPUT ki;
HARDWAREINPUT hi;
};
} INPUT, *PINPUT;
SendInput = Win32API.new("User32", "SendInput", "LPL", "L")
INPUT_KEYBOARD = 1
所以我需要一个整数来显示输入类型。
因为我对键盘事件感兴趣,所以我查看了KEYBDINPUT
struct
typedef struct tagKEYBDINPUT {
WORD wVk;
WORD wScan;
DWORD dwFlags;
DWORD time;
ULONG_PTR dwExtraInfo;
} KEYBDINPUT, *PKEYBDINPUT;
还有另外5个参数:两个16位整数和三个32位整数
现在,根据我收集的信息,SendInput
接受一个整数、一个指向输入结构的指针和一个表示输入结构大小的整数。创建Win32API
对象如下所示
typedef struct tagINPUT {
DWORD type;
union {
MOUSEINPUT mi;
KEYBDINPUT ki;
HARDWAREINPUT hi;
};
} INPUT, *PINPUT;
SendInput = Win32API.new("User32", "SendInput", "LPL", "L")
INPUT_KEYBOARD = 1
现在我构建输入结构:
input = [INPUT_KEYBOARD, 0x5A, 0, 0, 0, 0].pack('ISSIII')
第一个参数是输入类型,然后是KEYBDINPUT
struct的五个参数:我要按的键的虚拟键代码,以及一些测试不需要的其他标志
所以我运行它:
SendInput.call(1, input, input.size)
什么也没发生
当我检查GetLastError时,它返回一个,这意味着存在无效参数
然后我决定四处搜索,发现其他人正在构建他们的输入结构,如下所示:
input = [INPUT_KEYBOARD, 0x5A, 0, 0, 0, 0, 0, 0].pack('ISSIIIII')
我试着运行它,它成功地执行了
区别?输入有两个额外的参数。
现在我很困惑:输入结构的这两个额外参数是什么?
我读文件的时候有没有遗漏什么
我认为这可能与ULONG_指针
类型有关,但当我查找数据类型时,它是一个32位整数
引用:函数调用接受这些结构的
并集,我敢打赌它与此有关
看起来鼠标输入
大于键盘输入
:
typedef struct tagMOUSEINPUT {
LONG dx;
LONG dy;
DWORD mouseData;
DWORD dwFlags;
DWORD time;
ULONG_PTR dwExtraInfo;
} MOUSEINPUT, *PMOUSEINPUT;
当然不知道,这似乎是一个非常可怕的沟通方式
编辑:是的,看起来像是使用MOUSEINPUT
size,你最终将有28字节的数据发送到函数,这就是pack('issiii')
将为你提供的信息。我简要阅读了关于工会的内容,以了解它们的用途,但没有阅读它们的实际实现方式。但仔细想想,这是有道理的:如果在同一内存空间中允许不同类型的数据,则至少需要最大类型的数据大小…@MxyL您的评论是否经过winapi专家等其他人的验证?这是有道理的,但我只是想知道它是否经过验证,我有相同的问题,并通过使我的kyinput结构具有与mouseinput结构相同的大小来修复它。与我的情况完全相同,但使用js ctypes,非常感谢您的分享!!!!