我正在尝试使用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)

我不知道该怎么修。根据documentationWinuser.h标题中声明。但不要为我工作。

最佳答案

#define _WIN32_WINNT 0x0403
#include <windows.h>

似乎这就是您在项目中需要的神奇定义(在代码中显式地,或者通过编译器命令行param-D)。
请注意,windows.h包含winuser.h,因此不需要包含它,因为它已经为您包含了。此外,WIN32_LEAN_和_MEAN define只有在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中的winuser.h(通常安装在C:\ Program Files\Microsoft SDKs\Windows\v7.1\Include\winuser.h中)使用了不同的条件:
#if (_WIN32_WINNT > 0x0400)

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

10-06 10:22