マウスとキーボードのイベント生成(VC++) SendInput()ウィンドウズAPIで、マウスとキーボードのイベントの発生を起こします。
1.マウスを移動します。 例:ウィンドウズの「スタート」をクリックする void ClickStartButton() { INPUT input[] = {{ INPUT_MOUSE, 0, 65535, 0, MOUSEEVENTF_ABSOLUTE | MOUSEEVENTF_MOVE, 0, 0 }, { INPUT_MOUSE, 0, 0, 0, MOUSEEVENTF_LEFTDOWN, 0, 0, }, { INPUT_MOUSE, 0, 0, 0, MOUSEEVENTF_LEFTUP, 0, 0, }}; ::SendInput(3, input, sizeof(INPUT)); }例:カーソルを回す void TurnCursor() { INPUT input[1] = {{INPUT_MOUSE, 0, 0, 0, MOUSEEVENTF_ABSOLUTE | MOUSEEVENTF_MOVE, 0, 0 }}; for (int i = 0; i < 360 * 10; i += 2) { input[0].mi.dx = (LONG)(32767 + 32767.0 / 2 * cos(i * atan(1.0) / 45)); input[0].mi.dy = (LONG)(32767 - 32767.0 / 2 * sin(i * atan(1.0) / 45)); ::SendInput(1, input, sizeof(INPUT)); Sleep(2); } }キーのイベントは、INPUTのunionのkiのメンバーを使います。配列にキーを纏めて入れるのは勿論ですが、キーを一つ一つで処理してもいいです。下記のKeyAction()関数で、一つのキーを打つ処理です。bKeepPressing引数は、押し続けるかのフラグです。 void KeyAction(WORD VirtualKey, BOOL bKeepPressing) { INPUT input[1]; input[0].type = INPUT_KEYBOARD; input[0].ki.wVk = VirtualKey; input[0].ki.wScan = MapVirtualKey(input[0].ki.wVk, 0); input[0].ki.dwFlags = KEYEVENTF_EXTENDEDKEY; input[0].ki.time = 0; input[0].ki.dwExtraInfo = ::GetMessageExtraInfo(); ::SendInput(1, input, sizeof(INPUT)); if (!bKeepPressing) { input[0].ki.dwFlags = KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP; ::SendInput(1, input, sizeof(INPUT)); } }例:EditBoxに"I love you."を打ち込む。 void CSendInputTestDlg::OnButton1() { CWnd* pWnd = GetDlgItem(IDC_EDIT1); if (pWnd) { pWnd->SetFocus(); KeyAction(VK_SHIFT, TRUE); KeyAction('I', FALSE); KeyAction(VK_SHIFT, FALSE); KeyAction(' ', FALSE); KeyAction('L', FALSE); KeyAction('O', FALSE); KeyAction('V', FALSE); KeyAction('E', FALSE); KeyAction(' ', FALSE); KeyAction('Y', FALSE); KeyAction('O', FALSE); KeyAction('U', FALSE); KeyAction(VK_OEM_PERIOD, FALSE); } } |