Seaside Laboratory

Post

怪盗ロワイヤル用ウィンクツール作成記 (キーボード編)

久しぶりにウィンクツールを起動してみたら使い物にならなくなっていた。原因は運営側の不正対策とかではなく、単純にゲーム画面のリニューアル。自作ウィンクツールは決められた場所を一定間隔でクリックするだけなので、デザイン変更にはめっぽう弱いという欠点がある。

そこで「キーボードを使ってブラウジングすれば位置とか関係ないやん!」と思い立ち、キーボード版のウィンクツールを作成することに。前回のマウスと同様に SendInput を使ってキーメッセージを送信するのだが、MOUSEINPUT 構造体と同じく KEYBDINPUT 構造体も解説が乏しいので keybd_event 関数の引数を参考にする。

typedef struct tagKEYBDINPUT
{
    WORD wVk;              // 仮想キーコード
    WORD wScan;            // ハードウェアスキャンコード
    DWORD dwFlags;         // 関数のオプション
    DWORD time;
    ULONG_PTR dwExtraInfo; // 追加のキーストロークデータ
} KEYBDINPUT, *PKEYBDINPUT;

構造体の各メンバは癖が強く、何を設定すれば正解なのかよくわからない。ネット上のサンプルを色々と見比べてとりあえず以下のコードを作成。

void PushKey( WORD wVk )
{
    INPUT input;

    input.type           = INPUT_KEYBOARD;
    input.ki.wVk         = wVk;
    input.ki.wScan       = ::MapVirtualKey( wVk, 0 );
    input.ki.dwFlags     = 0;
    input.ki.time        = 0;
    input.ki.dwExtraInfo = ::GetMessageExtraInfo();

    ::SendInput( 1, &input, sizeof( INPUT ) );
}

当初は構造体宣言時に初期化する方法をとっていたが何故か動かなかったので、各メンバをひとつずつ初期化する方式に変更した。もしかすると内部的なメンバの並びがヘルプとは違っているのかも。

出来上がったキーボード関数は以下のような感じで使う。

void CClicker::PushUpdateButton()
{
    PushKey( VK_F5 );
}

F5 キーはページ更新のショートカットなので、PushUpdateButton を呼べばページが更新される。こんな調子でショートカットキーと機能を対応付けていけばキーボード版ウィンクツールが完成する。

早速動かしてみたら、まったく関係ないページを激しく更新してたりして挙動がおかしい。よく見てみると、目的のリンクの手前に別のリンクが出たり出なかったりで関係ないページを辿っていた模様。


囲ってある部分のリンク数が変化する。

結論。キーボードもダメでした。