【お知らせ】プログラミング記事の投稿はQiitaに移行しました。

マウスやキーボードの自動操作

WindowsではSendInput()というAPIでマウスやキーボードの自動操作が可能です。検索してもあまりサンプルが出てこなかったので、参考までにソースを貼ります。

指定したスクリーン座標をクリックして[Ctrl]+[C]を押したことにするコードです。

void ClickAndCopy(int x, int y)
{
    INPUT ipt[7];
    ZeroMemory(ipt, sizeof(ipt));
    ipt[0].type = INPUT_MOUSE;
    ipt[0].mi.dx = x * 65536 / GetSystemMetrics(SM_CXSCREEN);
    ipt[0].mi.dy = y * 65536 / GetSystemMetrics(SM_CYSCREEN);
    ipt[0].mi.dwFlags = MOUSEEVENTF_ABSOLUTE | MOUSEEVENTF_MOVE;
    ipt[0].mi.dwExtraInfo = GetMessageExtraInfo();
    ipt[1].type = INPUT_MOUSE;
    ipt[1].mi.dwFlags = MOUSEEVENTF_LEFTDOWN;
    ipt[1].mi.dwExtraInfo = GetMessageExtraInfo();
    ipt[2].type = INPUT_MOUSE;
    ipt[2].mi.dwFlags = MOUSEEVENTF_LEFTUP;
    ipt[2].mi.dwExtraInfo = GetMessageExtraInfo();
    ipt[3].type = INPUT_KEYBOARD;
    ipt[3].ki.wVk = VK_CONTROL;
    ipt[3].ki.wScan = MapVirtualKey(VK_CONTROL, 0);
    ipt[3].ki.dwExtraInfo = GetMessageExtraInfo();
    ipt[4].type = INPUT_KEYBOARD;
    ipt[4].ki.wVk = 'C';
    ipt[4].ki.wScan = MapVirtualKey('C', 0);
    ipt[4].ki.dwExtraInfo = GetMessageExtraInfo();
    ipt[5].type = INPUT_KEYBOARD;
    ipt[5].ki.wVk = 'C';
    ipt[5].ki.wScan = MapVirtualKey('C', 0);
    ipt[5].ki.dwFlags = KEYEVENTF_KEYUP;
    ipt[5].ki.dwExtraInfo = GetMessageExtraInfo();
    ipt[6].type = INPUT_KEYBOARD;
    ipt[6].ki.wVk = VK_CONTROL;
    ipt[6].ki.wScan = MapVirtualKey(VK_CONTROL, 0);
    ipt[6].ki.dwFlags = KEYEVENTF_KEYUP;
    ipt[6].ki.dwExtraInfo = GetMessageExtraInfo();
    SendInput(7, ipt, sizeof(INPUT));
}

座標の指定方法が特殊なため注意が必要です。(ipt[0].mi.dx, ipt[0].mi.dyの部分)