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)

tihisを修正する方法がわかりません。ドキュメントによると、それはWinuser.hヘッダーで宣言されています。しかし、私にはうまくいきません。

4

3 に答える 3

3

追加する必要があると思います

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

ソースにwindowshとwinuser.hを含める前。

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

これは、プロジェクトのどこかに必要な魔法の#defineのようです(コード内で明示的に、またはコンパイラのコマンドラインparam -Dを介して)。

windows.hにはwinuser.hが含まれているため、すでに含まれているため、含める必要はありません。また、WIN32_LEAN_AND_MEAN定義は、ウィンドウの前に含まれている場合にのみ効果があります。ここで何をするかについての詳細; 最近は必要ないか、特に便利ではありません。

-

では、ここで何が起こっているのでしょうか。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)

...これはジェイの提案を説明しています-彼はおそらくMSファイルを見ています。ここでは0x0401で十分です。また、それが機能しない理由についても説明します。バージョン要件の高いcygwinを使用している可能性があります。これらの2つのファイルが異なる理由については-私はそこにわかりません...

于 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 に答える