0

我正在尝试使用SendInput()功能。我写了这段代码:

#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#include <winuser.h>

#define WIN32_LEAN_AND_MEAN

//...

    KEYBDINPUT kbi;
    kbi.wVk = 0x31;
    kbi.wScan = 0;
    kbi.dwFlags = 0;
    kbi.time = 0;

    INPUT input;
    input.type = INPUT_KEYBOARD;
    input.ki = kbi;

    SendInput(1, &input, sizeof input);

编译:

gcc -Wall -o window.exe win32.c -lWs2_32

我得到:

win32.c: In function ‘main’:
win32.c:13:2: error: ‘KEYBDINPUT’ undeclared (first use in this function)
win32.c:13:2: note: each undeclared identifier is reported only once for each function it appears in
win32.c:13:13: error: expected ‘;’ before ‘kbi’
win32.c:14:2: error: ‘kbi’ undeclared (first use in this function)
win32.c:20:2: error: ‘INPUT’ undeclared (first use in this function)
win32.c:20:8: error: expected ‘;’ before ‘input’
win32.c:21:2: error: ‘input’ undeclared (first use in this function)
win32.c:21:15: error: ‘INPUT_KEYBOARD’ undeclared (first use in this function)

我不知道如何解决这个问题。根据文档,它在Winuser.h标题中声明。但对我不起作用。

4

3 回答 3

3

我想你需要添加

#define _WIN32_WINNT 0x0401
#include <windows.h>
#include <winuser.h>

在您的源代码中包含 windowssh 和 winuser.h 之前。

于 2012-06-20T16:49:18.927 回答
3
#define _WIN32_WINNT 0x0403
#include <windows.h>

似乎这是您在项目中某处需要的魔法#define(在代码中明确显示,或通过编译器命令行参数-D)。

请注意,windows.h 包含 winuser.h,因此无需包含它,因为它已经为您包含在内。此外,WIN32_LEAN_AND_MEAN 定义仅在包含windows 之前才有效。关于它在这里做什么的详细信息;这些天不需要或特别有用。

--

那么这里发生了什么?在winuser.h(C:\Cygwin\usr\include\w32api\winuser.h)中寻找KBDINPUT的定义,我们看到:

#if (_WIN32_WINNT >= 0x0403)
typedef struct tagMOUSEINPUT {
...
} MOUSEINPUT,*PMOUSEINPUT;
typedef struct tagKEYBDINPUT {
...

那就是问题所在; 这些只有在 _WIN32_WINNT 大于 0x0403 时才被定义。

这些是 cygwin 包中的文件。有趣的是,来自 Microsoft SDK(通常安装在 C:\Program Files\Microsoft SDKs\Windows\v7.1\Include\WinUser.h)中的 winuser.h 使用不同的条件:

#if (_WIN32_WINNT > 0x0400)

...这解释了 Jay 的建议 - 他可能正在查看 MS 文件,这里 0x0401 就足够了;并且还解释了为什么它不适合你——你可能使用的是具有更高版本要求的 cygwin。至于为什么这两个文件不同 - 我不知道那里......

于 2012-06-20T23:41:00.180 回答
0

这是像 VC6 这样的旧 IDE 的问题,我尝试了上述方法,但没有成功。我必须在项目设置上提供标志。

转到设置>> C / C ++选项卡>>从类别组合框中选择“常规”添加/D _WIN32_WINNT=0x401到项目设置编辑框。那是针对VC6的。

/d是您提供标志的方式,实际标志是_WIN32_WINNT=0x401。我必须将其设置为 0x401,其他值(如 0x0500)会导致更多错误。

于 2017-09-27T18:07:38.620 回答