Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 通过win32API调用SendInput时,这些额外参数是什么_Ruby_Winapi_Struct_Msdn - Fatal编程技术网

Ruby 通过win32API调用SendInput时,这些额外参数是什么

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;

我对使用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;
    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,非常感谢您的分享!!!!