![]() |
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 // 構造体のサイズ
);
}