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