OrangeMaker_logo
memo アイコン SDK-MFC 備忘録

Windows SDKやMFCに関するメモです。
(記載内容について正しいことを保証するものではありません。MSDN等で確認してください)

マウス&キーボードイベント生成

SendInput()を使用してマウス、キーボードイベントを生成する。

(1)マウスイベント

マウスイベントの場合は注意点は、マウスロケーションをスクリーン座標から32bit座標に変換する必要があります。

//スクリーン座標->32bit座標
#define MOUSE_LOCATION_X(x) ((DWORD)x * WORD(-1)/::GetSystemMetrics(SM_CXSCREEN))
#define MOUSE_LOCATION_Y(y) ((DWORD)y * WORD(-1)/::GetSystemMetrics(SM_CYSCREEN))

sx:スクリーン座標X
sy:スクリーン座標Y
	
{
    INPUT data;
    memset(&data, 0, sizeof(data));
    data.type = INPUT_MOUSE;
    data.mi.dx = MOUSE_LOCATION_X(sx);
    data.mi.dy = MOUSE_LOCATION_Y(sy);
    data.mi.dwFlags = MOUSEEVENTF_LEFTDOWN|MOUSEEVENTF_MOVE|MOUSEEVENTF_ABSOLUTE;
    UINT count = SendInput(
        1,	//UINT nInputs, // 入力イベントの数
        &data, 		//LPINPUT pInputs, // 挿入する入力イベントの配列
        sizeof(INPUT) 	//int cbSize // 構造体のサイズ
    );
}
		

  dwFlagsのMOUSEEVENTF_ELFTDOWNの部分を書き換えればイベント内容が変わります。

デファイン名 発生イベント
MOUSEEVENTF_LEFTDOWN 左ボタンダウン
MOUSEEVENTF_LEFTUP 左ボタンアップ
MOUSEEVENTF_RIGHTDOWN 右ボタンダウン
MOUSEEVENTF_RIGHTUP 右ボタンアップ
MOUSEEVENTF_MIDDLEDOWN 中央ボタンダウン
MOUSEEVENTF_MIDDLEUP 中央ボタンアップ

上記のマウス動作イベントを省略してMOUSEEVENTF_MOVEのみとすればマウスの移動のみとなります。
逆にMOUSE動作のイベントのみであればMOUSEEVENTF_MOVEの指定及びdx,dyフィールドの設定は不要です。

マウスのホイール動作は、INPUT構造体のmouseDataフィールドに回転方向のデータを設定します。
このデータは、通常ウィンドウに通知されるメッセージで通知されるデータと同様に120の倍数データが使用されます。(通常は一回のイベントで120か-120を設定すればよい)

{
    INPUT data;
    memset(&data, 0, sizeof(data));
    data.type = INPUT_MOUSE;
    data.mi.dx = MOUSE_LOCATION_X(sx);
    data.mi.dy = MOUSE_LOCATION_Y(sy);
    data.mi.mouseData = (DWORD)120;//OR (DWORD)(-120)
    data.mi.dwFlags = MOUSEEVENTF_WHEEL|MOUSEEVENTF_MOVE|MOUSEEVENTF_ABSOLUTE;
    UINT count = SendInput(
        1,			//UINT nInputs,	// 入力イベントの数
        &data,	//LPINPUT pInputs,	// 挿入する入力イベントの配列
        sizeof(INPUT)	//int cbSize	// 構造体のサイズ
    );
}
		

(2)キーボードイベント

キーボードは比較的簡単です。

-KEYDOWN
keycode:仮想キーコード
{
    INPUT data;
    memset(&data, 0, sizeof(data));
    data.type = INPUT_KEYBOARD;
    data.ki.wVk = keycode;
    data.ki.wScan = MapVirtualKey(keycode, 0);
    data.ki.dwFlags = KEYEVENTF_EXTENDEDKEY;
    UINT count = SendInput(
        1,//UINT nInputs, // 入力イベントの数
&data, //LPINPUT pInputs, // 挿入する入力イベントの配列 sizeof(INPUT) //int cbSize // 構造体のサイズ
); }
		
-KEYUP
    keycode:仮想キーコード
{
    INPUT data;
    memset(&data, 0, sizeof(data));
    data.type = INPUT_KEYBOARD;
    data.ki.wVk = keycode;
    data.ki.wScan = MapVirtualKey(keycode, 0);
    data.ki.dwFlags = KEYEVENTF_EXTENDEDKEY|KEYEVENTF_KEYUP;
    UINT count = SendInput(
        1,//UINT nInputs,	// 入力イベントの数
&data, //LPINPUT pInputs, // 挿入する入力イベントの配列 sizeof(INPUT) //int cbSize // 構造体のサイズ ); }