code :: blocks出现奇怪的编译错误

我昨天从Visual Studio切换到Code :: Blocks,只是有一些奇怪的编译器错误消息。

我包含了windows.h,我可以使用所有API调用,例如创建窗口类和创建窗口/按钮和东西。 但是当我尝试使用SendInput()发送一些按键时,我收到了关于这两个声明的错误消息:

 INPUT ip; KEYBDINPUT kbi; 

编译器错误:

 C:\code_blocks\test-app\main.cpp|21|error: 'INPUT' was not declared in this scope| C:\code_blocks\test-app\main.cpp|22|error: 'KEYBDINPUT' was not declared in this scope| 

我甚至可以右键单击KEYBDINPUTINPUT并单击“查找声明”,它在“winuser.h”(在里面)中找到它,但它仍然给我这些错误消息,它们未被声明。

此代码在VS中正常工作,只包含windows.h。 我正在使用GNU GCC编译器。

我认为你需要预处理器指令(Visual Studio可能已经添加了它们):

_WIN32_WINNT定义为什么?

也许你可以添加:

 #ifndef _WIN32_WINNT #define _WIN32_WINNT 0x0400 #endif 

或者您可以将它作为编译序列的一部分添加到预处理器指令中。 任何好的编译器都会拥有它。

如果仍然无效,请删除包含警卫并直接定义。 也许它正在其他地方定义。

一些编译器将在预处理器指令设置中具有此function: WIN32,_DEBUG,_CONSOLE,_MBCS,_WIN32_WINNT=0x0400

要详细说明Changeling的答案,如果你看一下说KEYBDINPUT的文档,你会看到它附近有一个支持最低版本操作系统版本的表。 VC ++将_WIN32_WINNT设置为比MinGW / GCC更高的版本(我猜测它是您使用Code :: Blocks的编译器),这可能是您遇到此问题的原因。

此宏的目的是防止您无意中使用与最小目标操作系统不兼容的API。

Windows API标头使用了许多与版本相关的宏。 细节可以在这里找到