Не удается найти тип данных, используемый функцией SendInput().

Я пытаюсь использовать функцию 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)

Я понятия не имею, как исправить tihis. Согласно документации, он объявлен в Winuser.h заголовок. Но не работает для меня.


person Jack    schedule 20.06.2012    source источник
comment
Вы можете проверить файлы заголовков, если эти структуры были объявлены в каком-либо макросе, и в этом случае вам придется передать это определение макроса через командную строку, используя параметр -D, или явно определить его в исходном коде.   -  person another.anon.coward    schedule 20.06.2012


Ответы (3)


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

Кажется, это волшебное #define, которое вам нужно где-то в вашем проекте (либо явно в коде, либо через параметр командной строки компилятора -D).

Обратите внимание, что windows.h включает в себя winuser.h, так что нет необходимости его включать, так как он уже включен за вас. Кроме того, определение WIN32_LEAN_AND_MEAN имеет какой-либо эффект только в том случае, если оно включено перед окнами. Подробности о том, что он делает здесь; это не нужно или особенно полезно в наши дни.

--

Так что же здесь происходит? Ищем определение KBDINPUT в winuser.h (C:\Cygwin\usr\include\w32api\winuser.h), видим:

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

Это проблема; они определяются только в том случае, если _WIN32_WINNT больше 0x0403.

Это файлы из пакета cygwin. Интересно, что winuser.h из Microsoft SDK (обычно устанавливается в C:\Program Files\Microsoft SDK\Windows\v7.1\Include\WinUser.h) использует другое условие:

#if (_WIN32_WINNT > 0x0400)

... что объясняет предложение Джея - он, вероятно, просматривает файлы MS, где 0x0401 было бы достаточно; а также объясняет, почему это не работает для вас - вы, вероятно, используете cygwin с более высокими требованиями к версии. Что касается того, почему эти два файла разные - я понятия не имею...

person BrendanMcK    schedule 20.06.2012

Я думаю, вам нужно добавить

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

перед включением windowsh и winuser.h в ваш исходный код.

person Jay    schedule 20.06.2012

Это проблема со старыми IDE, такими как VC6, я пробовал выше, и это не сработало. Мне пришлось поставить флаг в настройках проекта.

Перейдите в «Настройка» >> вкладка «C/C++» >> выберите «Общие» в поле со списком «Категория», добавьте /D _WIN32_WINNT=0x401 в поле редактирования настроек проекта. Это для VC6.

/d — это то, как вы предоставляете флаг, а фактический флаг _WIN32_WINNT=0x401. Мне пришлось установить его на 0x401, другие значения, такие как 0x0500, вызывали больше ошибок.

person zar    schedule 27.09.2017