[C言語]コンソールウィンドウのグラフィカルインターフェイスプログラミング(7):マウスイベント

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;
}

おすすめ

転載: blog.csdn.net/dengjin20104042056/article/details/90552458