00.目次
01.INPUT_RECORD構造
コンソール入力バッファ内の入力イベントを記述します。ReadConsoleInputまたはPeekConsoleInput関数を使用して、これらのレコードを入力バッファーから読み取るか、WriteConsoleInput関数を使用してこれらのレコードを入力バッファーに書き込むことができます。
タイプ宣言:
typedef struct _INPUT_RECORD {
WORD EventType;
union {
KEY_EVENT_RECORD KeyEvent;
MOUSE_EVENT_RECORD MouseEvent;
WINDOW_BUFFER_SIZE_RECORD WindowBufferSizeEvent;
MENU_EVENT_RECORD MenuEvent;
FOCUS_EVENT_RECORD FocusEvent;
} Event;
} INPUT_RECORD;
イベントタイプ
イベントメンバーに保存されているイベントタイプとイベントレコードのハンドルを入力します。
このメンバーは、次のいずれかの値になります。
値 | 意味 |
---|---|
FOCUS_EVENT 0x0010 | イベントのメンバーが含まれていFOCUS_EVENT_RECORDの構造を。これらのイベントは内部で使用されるため、無視する必要があります。 |
KEY_EVENTは0x0001 | イベントのメンバーが含まれていKEY_EVENT_RECORDキーボードイベントに関する構造情報を。 |
MENU_EVENT 0x0008 | イベントのメンバーが含まれていMENU_EVENT_RECORDの構造を。これらのイベントは内部で使用されるため、無視する必要があります。 |
MOUSE_EVENT 0x0002 | イベントのコンポーネントが含まれている情報では、マウスの動きやキープレスイベントについてMOUSE_EVENT_RECORDの構造を。 |
WINDOW_BUFFER_SIZE_EVENT 0x0004 | イベント部材が含まWINDOW_BUFFER_SIZE_RECORDのコンソールスクリーンバッファの新しいサイズについての構造情報を記憶します。 |
イベント
イベント情報。このメンバーの形式は、EventTypeメンバーによって指定されたイベントタイプによって異なります。
02.MOUSE_EVENT_RECORD構造
コンソールのINPUT_RECORD構造でマウス入力イベントを記述します。
タイプ宣言:
typedef struct _MOUSE_EVENT_RECORD {
COORD dwMousePosition;
DWORD dwButtonState;
DWORD dwControlKeyState;
DWORD dwEventFlags;
} MOUSE_EVENT_RECORD;
メンバーの説明
dwMousePositionはCOORDのコンソールスクリーンバッファの文字セル座標に応じてカーソルの位置を含む構造体。
dwButtonState
マウスボタンの状態。最下位ビットは、マウスの左端のボタンに対応します。次の最下位ビットは、マウスの右端のボタンに対応します。次の桁は、左から右へのマウスボタンを表します。次に、これらのビットは左から右へのマウスボタンに対応します。ボタンが押された場合、ビットは1です。
次の定数は、最初の5つのマウスボタンに対して定義されています。
値 | 意味 |
---|---|
FROM_LEFT_1ST_BUTTON_PRESSEDは0x0001 | 左端のマウスボタン。一般的に言って、マウスの左ボタン |
FROM_LEFT_2ND_BUTTON_PRESSED 0x0004 | 左から2番目のボタン。一般的に、マウスの中ボタンはスクロールホイールボタンです |
FROM_LEFT_3RD_BUTTON_PRESSED 0x0008 | 左から3番目のボタン。 |
FROM_LEFT_4TH_BUTTON_PRESSED 0x0010 | 左から4番目のボタン。 |
RIGHTMOST_BUTTON_PRESSED 0x0002 | 右端のマウスボタン。一般的に言って、マウスの右ボタン |
dwControlKeyState
制御キーの状態。このメンバーは、次の1つ以上の値にすることができます。
値 | 意味 |
---|---|
CAPSLOCK_ON 0x0080 | キャップロックがオンになっている |
ENHANCED_KEY 0x0100 | 拡張キーが押された |
LEFT_ALT_PRESSED 0x0002 | 左のALTキーを押します。 |
LEFT_CTRL_PRESSED 0x0008 | 左のCTRLキーを押します。 |
NUMLOCK_ON 0x0020 | デジタルロックがオンになっている |
RIGHT_ALT_PRESSEDは0x0001 | 右のALTキーを押します。 |
RIGHT_CTRL_PRESSED 0x0004 | 右のCTRLキーを押します。 |
SCROLLLOCK_ON 0x0040 | スクロールロックがオンになっている |
SHIFT_PRESSED 0x0010 | SHIFTキーを押します。 |
dwEventFlags
マウスイベントタイプ。この値がゼロの場合は、マウスボタンが押されているか離されていることを意味します。それ以外の場合、このメンバーは次のいずれかの値です。
値 | 意味 |
---|---|
DOUBLE_CLICK 0x0002 | ダブルクリックの2回目のクリック(ボタンを押す)が発生します。最初のクリックは、通常のボタンイベントとして返されます。 |
MOUSE_HWHEELED 0x0008 | 水平マウスホイールが移動しました。場合の上位ワードdwButtonState部材は正の値、右側の車輪が回転を含んでいます。それ以外の場合、ホイールは左に回転します。 |
MOUSE_MOVEDは0x0001 | マウスの位置が変更されました。 |
MOUSE_WHEELED 0x0004 | 垂直マウスホイールが移動します。場合の上位ワードdwButtonState部材が離れてユーザから正の値、前輪回転を含んでいます。それ以外の場合、ホイールはユーザーに向かって後方に回転します。 |
03.ReadConsoleInput関数
コンソール入力バッファーからデータを読み取り、バッファーから削除します。
関数宣言:
BOOL WINAPI ReadConsoleInput(
_In_ HANDLE hConsoleInput,
_Out_ PINPUT_RECORD lpBuffer,
_In_ DWORD nLength,
_Out_ LPDWORD lpNumberOfEventsRead
);
功能:
从控制台输入缓冲区读取数据并将其从缓冲区中删除。
参数:
hConsoleInput 控制台输入缓冲区的句柄。句柄必须具有GENERIC_READ访问权限。
lpBuffer 指向接收输入缓冲区数据的INPUT_RECORD结构数组的指针。
nLength 数组元素中lpBuffer参数 指向的数组大小。
lpNumberOfEventsRead 指向接收读取的输入记录数的变量的指针。
返回值:
如果函数成功,则返回值为非零值。
如果函数失败,则返回值为零。要获取扩展错误信息,请调用GetLastError。
公式リファレンスURL:https://docs.microsoft.com/en-us/windows/console/readconsoleinput
04.サンプルプログラム
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include <Windows.h>
#include <conio.h>
int main(void)
{
//定义句柄变量
HANDLE hOut = NULL;
HANDLE hIn = NULL;
//定义输入事件结构体
INPUT_RECORD mouseRecord;
//用于存储读取记录
DWORD res;
//用于存储鼠标当前位置
COORD pos;
//获取标准输出句柄
hOut = GetStdHandle(STD_OUTPUT_HANDLE);
//获取标准输入句柄
hIn = GetStdHandle(STD_INPUT_HANDLE);
while (1)
{
//读取输入事件
ReadConsoleInput(hIn, &mouseRecord, 1, &res);
//获取鼠标当前位置
pos = mouseRecord.Event.MouseEvent.dwMousePosition;
//如果当前事件是鼠标事件
if (mouseRecord.EventType == MOUSE_EVENT)
{
//单击鼠标左键
if (mouseRecord.Event.MouseEvent.dwButtonState == FROM_LEFT_1ST_BUTTON_PRESSED)
{
printf("鼠标左键单击 x: %d y: %d\n", pos.X, pos.Y);
}
//单击鼠标右键
if (mouseRecord.Event.MouseEvent.dwButtonState == RIGHTMOST_BUTTON_PRESSED)
{
printf("鼠标右键单击 x: %d y: %d\n", pos.X, pos.Y);
}
//如果是双击就退出循环
if (mouseRecord.Event.MouseEvent.dwEventFlags == DOUBLE_CLICK)
{
break;
}
}
}
//关闭句柄
CloseHandle(hOut);
CloseHandle(hIn);
//system("pause");
getchar();
return 0;
}