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

标签 ruby winapi struct msdn

我有兴趣使用 win32API 通过 Ruby 发送按键输入。 我找到了我想调用的函数:SendInput

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;

所以我需要一个整数来显示输入类型。 由于我对键盘事件感兴趣,所以我查看了 KEYBDINPUT结构

typedef struct tagKEYBDINPUT {
  WORD      wVk;
  WORD      wScan;
  DWORD     dwFlags;
  DWORD     time;
  ULONG_PTR dwExtraInfo;
} KEYBDINPUT, *PKEYBDINPUT;

还有另外 5 个参数:两个 16 位整数和三个 32 位整数。

现在,根据我收集的信息,SendInput接受一个整数、一个指向 INPUT 结构的指针和一个表示 INPUT 结构大小的整数。创建Win32API对象看起来像

SendInput = Win32API.new("User32", "SendInput", "LPL", "L")
INPUT_KEYBOARD = 1

现在我构建我的 INPUT 结构:

input = [INPUT_KEYBOARD, 0x5A, 0, 0, 0, 0].pack('ISSIII')

第一个参数是输入类型,后跟 KEYBDINPUT 的五个参数struct:我想要按下的键的虚拟键码,以及一些我不需要用于测试目的的其他标志。

所以我运行它:

SendInput.call(1, input, input.size)

没有任何反应。

当我检查 GetLastError 时,它返回 error code of 87 ,这意味着存在无效参数。

然后我决定四处搜索,发现其他人正在像这样构建他们的输入结构:

input = [INPUT_KEYBOARD, 0x5A, 0, 0, 0, 0, 0, 0].pack('ISSIIIII')

我尝试运行它,它执行成功了!

区别?输入有两个额外的参数。 现在我很困惑:输入结构的这两个额外参数是什么? 我在阅读文档时是否遗漏了什么?

我认为这可能与ULONG_POINTER有关。类型,但是当我查找数据类型时,它是一个 32 位整数。

引用:http://www.dsprobotics.com/support/viewtopic.php?p=7110&sid=cd256b848d00e64a2e74e093863f837f#p7110

最佳答案

函数调用需要这些结构的联合,我敢打赌它与此有关。

看起来MOUSEINPUTKEYBOARDINPUT大:

typedef struct tagMOUSEINPUT {
  LONG      dx;
  LONG      dy;
  DWORD     mouseData;
  DWORD     dwFlags;
  DWORD     time;
  ULONG_PTR dwExtraInfo;
} MOUSEINPUT, *PMOUSEINPUT;

当然不知道,这似乎是一种非常可怕的桥接这些调用的方式!

编辑:是的,看起来使用 MOUSEINPUT 大小,最终会将 28 字节的数据发送到函数,这就是 pack('ISSIIII') 会网住你。

关于ruby - 通过 win32API 调用 SendInput 时这些额外参数是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27972667/

相关文章:

php - 什么是编写此函数的更好方法。它获取一个远程文件并将其复制到本地,在 php 中

C++ 结构和构造

winapi - LoadLibraryW 和 POSIX 路径分隔符

ruby-on-rails - 无法向 Rails 4.2.6 中的 ActiveRecord 枚举添加前缀?

ruby - 在 ruby​​ 中操作字符串

c - 如何初始化一个(复杂的?)结构

c - 是否有类似 "man"的命令来列出结构成员?

c++ - bool 从结构导致 "error: expression must have class type"

Ruby:读取两个文件

ruby-on-rails - 嵌套形式和茧。未定义方法 `label' 为 nil :NilClass