第八回・自動でクリックするプログラム

 さて、今回は趣向を変えて自動でクリックするプログラムを作ってみます。
自動でクリックするプログラム…つまりアレなゲームをやるときに勝手に
クリックして進めるプログラムです。

 ですがただクリックし続けるだけでは不便です。なので右クリック
をした場合にはクリックを止めるようにします。

 さて、ではソースコードを見てください。

 ソースコード(新しいウィンドウで開きます)

 ですが、今回はリソースでダイアログボックスを利用します。
 まずはリソースでダイアログボックスを作る方法を解説します。

 と、その前にプロジェクトの作り方を。

 1.「ファイル」→「新規作成」
 2.Win32 Applicationを選択
 3.プロジェクト名に「succ08」と入力する
 4.(VC6の場合のみ)空のプロジェクトを選択して「終了」→「OK」
 5.「ファイル」→「新規作成」
 6.「C++ソースファイル」を選択
 7.ファイル名に「succ.cpp」と入力→「OK」

 次にリソースを作成します。

 1.「挿入」→「リソース」
 2.「Dialog」を選択して「新規作成」
 これでダイアログエディタが起動します。
 3.「OK」というボタンの上で右クリックし、「プロパティ」
 4.「キャプション」に「3秒後にスタート」と入力して閉じます。
 5.同様にキャンセルボタンのキャプションも「終了」と入力
 6.今度はそれらのボタンの外側を右クリック→「プロパティ」
  ※ダイアログ全体のプロパティになります
 7.キャプションに「自動クリックプログラム」と入力
 8.全体のサイズはお好みに。
 9.ダイアログエディタを終了します。

 すると『Script1 *』というタイトルのウィンドウがあると思うので
それも閉じます。すると変更を保存するか訪ねてくるので「はい」を選択。
ファイル名はそのままでかまいません。

 10.「プロジェクト」→「プロジェクトへ追加」→「ファイル」
 11.そして先ほど保存した「Script1.rc」を選択→「OK」

 これでリソースを取り込むことができました。
 ただし、このやり方は私が試行錯誤で覚えたやり方なので正式な
やり方かどうかわかりません。正式な方法を知っておられる方、
教えてください。

 ちなみに先ほどのダイアログボックスを修正したい場合はVC++で
ソースコードを編集するウィンドウの左側にあるウィンドウ
(ワークスペースウィンドウと言うらしい)のResouceタブに
あるので編集してください。

 さて、やっと解説に入ります。
#include <windows.h>
#include "resource.h"
 この最初の部分はわかりますね?
windows.hとresource.hをインクルードしています。
resource.hはリソースのIDなどが自動で記述されるファイルです。
//定数
#define ID_TIMER 100

//プロトタイプ宣言
LRESULT CALLBACK DlgProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp);
 この部分はそのままですね。
ID_TIMERはタイマーのIDです。
//////////////////エントリーポイント//////////////////////////////////////////
int WINAPI WinMain(HINSTANCE hCurInst, HINSTANCE hPrevInst,LPSTR lpsCmdLine, int nCmdShow)
{
        DialogBox(hCurInst, MAKEINTRESOURCE(IDD_DIALOG1), NULL, (DLGPROC)DlgProc);
        return 0;
}
 WinMain関数ではDialogBox関数を呼び出しているだけです。
このような方法でダイアログアプリケーションを作成することができます。
例によって正しい方法かどうかはわかりません。(それでいいのか?)

 さて、次はダイアログプロシージャです。前回、前々回に出てきた
ウィンドウプロシージャと似ていますがこちらの方が多少簡単です。
        case WM_INITDIALOG:
                SetWindowPos(hWnd,HWND_TOPMOST,0,0,0,0,SWP_NOMOVE | SWP_NOSIZE);
                return TRUE;
 まずこの部分ですがダイアログが初期化されるときに送られるメッセージです。
ウィンドウプロシージャのWM_CREATEみたいなものです。
ここではウィンドウを最前面にしています。
        case WM_COMMAND:
        switch (LOWORD(wp))
                {
                case IDOK:
                        SetTimer(hWnd, ID_TIMER, 60, NULL);
                        dwCount = ::GetTickCount();
                        break;
                case IDCANCEL:
                        KillTimer(hWnd, ID_TIMER);
                        PostMessage(hWnd, WM_CLOSE, 0, 0);
                        break;
                }
                return TRUE;
 WM_COMMANDはボタン等が押された場合に送られるメッセージです。
OKボタン(今回は「3秒後にスタート」ってボタンですね)の場合はタイマーをセットし
その時の時間(Windowsが起動してからのミリ秒)を記録しています。
 そしてキャンセルボタン(今回は「終了」ボタン)の場合はタイマーを終了し
WM_CLOSEメッセージを自分自身に送っています。
        case WM_TIMER:
                if(GetTickCount()-dwCount < 3*1000)
                        return 0;
 WM_TIMERはタイマーをセットした場合に指定した時間ごとに送られる
メッセージです。ここではまずタイマーをセットした時の時間から3秒
経過したかどうかチェックしています。
                sKeyCheck = ::GetKeyState(VK_RBUTTON);
                if(sKeyCheck & 0x8000)
                {
                        KillTimer(hWnd, ID_TIMER);
                        return 0;
                }
 その後マウスの右ボタンが押されているかチェックしています。
GetKeyState関数はちょっとクセがあるので注意してください。
引数に仮想キーコードを渡してそのキーが押されているかどうかを
チェックするわけですが、押されていた場合は最上位ビットが1の
16ビットの数が返されます。

つまり押されていた場合は

1000 0000 0000 0000

という数(二進数で)が返されます。この数を16進数で表現すると

8000

となり、この数と&演算子でビット積を求めることによって
押されていたかどうかをチェックできるわけです。
なお、仮想キーコードはwinuser.hに記述されているのでほかのキーを
使いたい場合はwinuser.hを参照してください。
                mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0);
                mouse_event(MOUSEEVENTF_LEFTUP, 0 ,0 ,0, 0);
                return TRUE;
 そして、mouse_event関数によりマウス操作を合成します。
        case WM_CLOSE:
                EndDialog(hWnd, IDOK);
                break;
 WM_CLOSEメッセージが来た場合はEndDialog関数を呼び出し、終了します。
ダイアログボックスはEndDialog関数を呼び出すことによって終了します。

 さーて、今回はいろんなテクニックが出てきましたね。
大雑把に解説しましたが詳しい部分はヘルプなどを見て調べてください。
では、お疲れさまでした。

…と思ったら思いっきりバグがありました。
それについては次回!


戻る