[kaze's test] プログラミングメモ →目次

マウスとキーボードのイベント生成(VC++)

SendInput()ウィンドウズAPIで、マウスとキーボードのイベントの発生を起こします。 


1.マウスを移動します。
マウスのイベントは、INPUTtypeINPUT_MOUSEを指定します。unionmiの構造体を使います。中のdy,dyの範囲は(0,0)-(65535,65535)に規定されているので、実際のスクリーンのx,y座標からdy,dyを算出する必要がある場合は、下記のマクロを使えます。
#define MI_H(x) (x * 65535 / (::GetSystemMetrics(SM_CXSCREEN) - 1))
#define MI_V(y) (y * 65535 / (::GetSystemMetrics(SM_CYSCREEN) - 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);
    }
}
キーのイベントは、INPUTunionの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);
    }
}