2012-06-20 69 views
0

我正在嘗試使用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。根據documentation它在 Winuser.h標題中聲明。但不適合我。任何幫助非常感謝。提前致謝。

+0

您可以檢查頭文件,如果這些結構已經在一些宏下聲明瞭,在這種情況下,您將不得不通過命令行使用'-D'選項來傳遞宏定義,或者在源代碼中明確定義它。 –

+0

謝謝!我會嘗試一下。 – Jack

回答

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

看來這是一個神奇的#define你需要的地方在項目中(無論是明確的代碼,或者通過編譯器命令行PARAM -D)。

請注意,windows.h包含winuser.h,所以不需要包含它,因爲它已經包含了你。此外,WIN32_LEAN_AND_MEAN定義僅在包括窗口之前包含任何影響。有關它的詳細信息here;這些日子不需要或特別有用。

-

那麼這裏發生了什麼?尋找在WINUSER.H的KBDINPUT的定義(C:\ Cygwin的的\ usr \包括\ w32api \ WINUSER.H),我們可以看到:

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

這就是問題所在;如果_WIN32_WINNT大於0x0403,這些只會被定義。

這些是來自cygwin包的文件。有趣的是,微軟SDK的WINUSER.H(通常安裝在C:\ Program Files文件\微軟的SDK \的Windows \ V7.1 \包括\ WINUSER.H)使用不同的條件:

#if (_WIN32_WINNT > 0x0400) 

...這解釋了Jay的建議 - 他可能會看MS文件,這裏0x0401就足夠了;也解釋了爲什麼它不適合你 - 你可能會使用cygwin版本的更高版本要求。至於爲什麼這兩個文件是不同的 - 我不知道那裏...

+1

+1!很好的解釋答案。 :) – Jay

3

我猜你需要包括你的源windowsh和WINUSER.H之前添加

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

+0

hm ..我得到同樣的錯誤。 – Jack

0

這是一個像VC6老的IDE問題,我嘗試了上述,它沒有奏效。我不得不在項目設置上提供標誌。

轉到設置>> C/C++選項卡>>從Catagory組合框中選擇'常規' 將/D _WIN32_WINNT=0x401添加到項目設置編輯框。這是VC6。

/d是您如何提供標誌並且實際標誌是_WIN32_WINNT = 0x401。我不得不將它設置爲0x401,其他值如0x0500導致更多的錯誤。

相關問題