マウス自動操作アプリ作成【Windowsフォームアプリケーション】

Windowsフォームアプリケーションでマウスを自動操作するアプリケーションを作ろう。

作り方は簡単。VisualBasicで、VisualStudioで作成していきます。

マウスを好きな場所に移動させて、好きな場所でクリックさせる自動化アプリです。

動画で説明している内容はこちら↑↑

誤作動を起こして変なところをクリックしても責任はとれませんので

1つずつデバッグをしながら動作確認をおすすめします。

STEP1 座標を取得する用のフォーム

最初にマウスを自動で動かすアプリケーションを作る前にマウスの座標を取得する

Windowsのフォームアプリケーションを作成します。

マウスを自動で動かして色々操作させたいけど、座標がわからないと指定した場所に設定できませんよね。

まず最初にLabelコントロールを2つ追加。

ツールボックスからLabelコントロールを2つフォームにセット。

ツールボックスがない場合は、表示タブからツールボックスを出しましょう。

次にButtonコントロールを2つ追加。

場所は適当でOKです。ツールボックスからButtonをクリックしフォームに2つセット。

そして、ボタンはButton1・Button2ではなくSTARTとSTOPに変更しましょう。

ボタンを右クリックし、プロパティを押下。

表示されたプロパティウインドウからTextの部分をSTARTに変更。もう1つはSTOPに変更します。

ボタンのテキストを変更したら、次にButtonのイベント(雷マーク)のClickをダブルクリックして

Buttonをクリックしたら起動するマクロを作成しましょう。

Buttonコントロールを選択した状態でプロパティウィンドウのイベント(雷マーク)を選択し

Clickイベントを探しダブルクリックします。

Private Sub Button1_ClickとButton1をクリックした際に実行されるプロシージャが挿入されます。

このEnd Subまでの間に命令を記述していきましょう。

まず取得した座標はMsgBox関数でダイアログボックスに表示します。

そして、座標を取得するには、System.Windows.Forms.Cursorクラスの

Position.XプロパティでX座標を取得可能で、Position.YプロパティでY座標を取得可能。

X座標は画面上の左端からの位置、Y座標は画面上の上端からの位置。

-------------------------------------------------

Public Class Form1

'Button1をクリックしたときに実行される命令
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click

    'X座標を取得しメッセージボックスに表示
    MsgBox(System.Windows.Forms.Cursor.Position.X)

    'Y座標を取得しメッセージボックスに表示
    MsgBox(System.Windows.Forms.Cursor.Position.Y)

End Sub

-------------------------------------------------

開始を押下し、フォームを起動。

フォームを起動し、STARTボタンを押下すると

そのSTARTボタンを押した時のX座標と、Y座標がメッセージボックスに出力される。

System.Windows.Forms.は省略が可能なので、省略し、取得した座標データを

最初に追加したLabel1とLabel2のTextに代入する。

これで取得した座標がラベルに表示される。

-------------------------------------------------

Public Class Form1

'Button1をクリックしたときに実行される命令
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click

    'X座標を取得しラベル1のテキストに設定
    Label1.Text = Cursor.Position.X

    'Y座標を取得しラベル2のテキストに設定
    Label2.Text = Cursor.Position.Y

End Sub

End Class

-------------------------------------------------

STARTを押した時のX座標とY座標を取得することはできたが、実用的ではない。

その為、STARTを押した場合、STOPを押すまで座標を取得し続ける形に変更する。

-------------------------------------------------

Public Class Form1

'flgという変数をTrueかFalseのブーリアン型で用意
Dim flg As Boolean

'Button1をクリックしたときに実行される命令
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click

    'flgがTrueになるまでループする
    Do Until flg

        'X座標を取得しラベル1のテキストに設定
        Label1.Text = Cursor.Position.X

        'Y座標を取得しラベル2のテキストに設定
        Label2.Text = Cursor.Position.Y

        '処理を実行する
        Application.DoEvents()

    Loop

End Sub

End Class

-------------------------------------------------

まずSTART側のButton1のコードを変更します。

DoLoopでflgがTrueになるまでループをさせる。

そして、そのままループさせていると、取得した座標をラベルに表示されないので

Application.DoEvents関数で処理を実行させる。

これで実行すると、STARTボタンを押すと、ラベルに座標が表示され、フォームを閉じるまで

座標を取得したい場所のX座標・Y座標を調べることが可能。

後はflgがTrueになるまでループするという設定にしてある為、STOPボタンをクリックしたら

flgをFalseにしてあげれば、ループが止まります。

Button2を選択し、イベントをClickを選択し、Button2をクリックしたときに実行される

命令を記述していきます。

Button2_Clickのプロシージャが入ったら、そこに命令を記述していきます。

Button2を押した時にflgをTrueにするだけです。

そうすれば、Button2を押したらflgはTrueになり、Do Until flgはflgがTrueになるまで

Do Loopで繰り返されるので、Trueになったら、Loopを抜けてくれます。

ただ、再度STARTのButton1を押してもflgはTrueのままなので座標取得ができません。

その為、Button1をクリックした最初にflg = falseでflgの値を初期値に戻してあげます。

これで、Button1をクリックしたらX座標・Y座標がマウスを移動させてもLabel1・Label2に表示され

STOPを押すと、座標の取得が止まるという形になります。

-------------------------------------------------

Public Class Form1

'flgという変数をTrueかFalseのブーリアン型で用意
Dim flg As Boolean

'Button1をクリックしたときに実行される命令
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click

    'flgをFalseに設定
    flg = False

    'flgがTrueになるまでループする
    Do Until flg

        'X座標を取得しラベル1のテキストに設定
        Label1.Text = Cursor.Position.X

        'Y座標を取得しラベル2のテキストに設定
        Label2.Text = Cursor.Position.Y

        '処理を実行する
        Application.DoEvents()

    Loop

End Sub

'Button2をクリックしたときに実行される命令
Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click

    'flgをTrueに設定する
    flg = True

End Sub

End Class

-------------------------------------------------

STEP2 マウス自動化フォーム

STEP1で指定した場所のX座標・Y座標を調べる用のフォームを作成することができました。

先程のフォームとは別に再度フォームを作成し、一からマウス自動化フォームを作成していきます。

次はX座標・Y座標を指定し、その場所にマウスを移動させ、クリックさせるものを作成していきます。

最初に、Formのみの状態でTextBoxコントロールを2つ追加。

Labelコントロールを2つ追加。

Label1をTextBox1の上に、Label2をTextBox2の上に設定します。

Label1のTextをX座標・Label2のTextをY座標と設定します。

Buttonコントロールを1つ追加します。

このButtonコントロールをClickした時にテキストボックスに指定したX座標・Y座標に

マウスカーソルが移動する仕組みをつくっていきます。

Button1のTextはSTARTに変更しておきます。

Button1のClickイベントを追加します。

雷マーク(イベント)からClickをダブルクリックし、Button1のClickプロシージャを挿入。

手順① まずはTextBox1とTextBox2の内容を取得する

TextBox内のテキストはTextで取得可能なので、TextBox1.Textでメッセージボックスに表示する。

そうすると、TextBox1の中のテキストを取得することができている。

次はTextBox1のTextとTextBox2のTextを取得しその座標に移動させる。

Cursorのポジションを指定するにはCursorのPositionプロパティで

新しいポジションを設定する。

New Pointで新しいインスタンスを初期化し、xに水平位置、yに縦の位置を指定。

仮にXを100のYを200にして実行する。

フォームを起動し、STARTボタンを押すと、X座標が100のY座標が200の位置に

マウスカーソルが移動する。

PointのXに移動したいX座標を指定し、Yに移動したいY座標を指定すれば良いのだから

XをTextBox1のTextの値にし、YをTextBox2のTextの値にする。

-------------------------------------------------

Public Class Form1

'Button1がクリックされた時に実行される命令
Private Sub Button1_Click_1(sender As Object, e As EventArgs) Handles Button1.Click

    'Cursorのポジションプロパティでポジションを指定 X座標はTextBox1のテキスト、Y座標はTextBox2のテキスト
    Cursor.Position = New Point(TextBox1.Text, TextBox2.Text)

End Sub

End Class

-------------------------------------------------

これで実行し、フォーム上のテキストボックスに任意の数値を入れてSTARTボタンを押下。

テキストボックスに入力したXが100、Yが200の位置に移動できるところまで完成。

ここでフォームアプリケーションを閉じて再度起動すると

TextBox1とTextBox2のTextが消えている。

マウス自動化アプリケーションとして、実行させて再度開くと再設定が必要であれば

手間なので、一度設定したテキストはそのまま残るように設定する。

TextBox1を選択し、プロパティからApplicationSettingsのPropertyBindingを選択する。

そうすると、PropertyBindingの値部分に・・・の設定項目が表示されるので押下。

プロパティをアプリケーション設定にバインドするの中からTextの項目の

下矢印を押下する。

何もない状態ですので、新規を押下します。

DevaultValueは初期値を指定することが可能です。

使う人や環境により、値は任意にしたいので

DefaultValueは空白のままNameだけ設定します。

Nameを任意の名前に設定したらOKボタンを押下します。

TextBox1のアプリケーション設定ダイアログもOKを押して閉じます。

Textの項目がなしからSampleText1とNameで設定した内容になっています。

TextBox1のプロパティを確認すると、Textプロパティの箇所に

ピンク色のマークが付き値はバインドされますとポップアップが出ます。

これで、入力した値がフォームを閉じても、そのまま残る設定となっています。

実際に、フォームを起動し、TextBox1とTextBox2にTextを100と両方入れてみましょう。

そして、フォームを閉じ、再度起動します。

すると、先程PropetyBindingの設定をしたTextBox1はTextの値が残っており

未設定のTextBox2は初期化されて何も値が入っていません。

このようにPropertyBindingの設定を行うと、使用した値を保持することが可能です。

※環境や、ファイル名、ユーザーが変わると保持されない等様々な条件は有ります。

Y座標のTextBox2も同じように設定しておきます。

先程とは違い、SampleText1がありますが

同じように新規でTextBox2専用の設定を行います。

両方設定することができたら、どちらもフォームを閉じて再起動しても

同じようにTextの値が残るようになっています。

これでアプリケーションを閉じても、前回と同じ設定で実行できるようになりました。

後は座標を移動するだけでは物足りないので、移動した先でクリックをさせます。

ここでマウスイベントAPIを使用します。

宣言文は下記の通りです。コピーして使用します。

 <Runtime.InteropServices.DllImport("USER32.DLL")>
 Private Shared Sub mouse_event(
    ByVal dwFlags As Integer, ByVal dx As Integer,
    ByVal dy As Integer, ByVal cButtons As Integer,
    ByVal dwExtraInfo As Integer)
    End Sub

最初に宣言文を一番上に記述しておきます。

外部にある機能を呼び出す宣言で、USER32.DLLからmouseeventという関数を使用します。

Sub 〇〇という関数を呼び出してもプログラムはどこの〇〇という関数かわからないので

それを最初に明示しておくイメージです。

そうすることで、このForm内でマウス操作の関数を使用することができます。

mouse_event関数の最初のdwFlagsにマウスイベントの種類を指定します。

どのような動作をマウスにさせるかを指定。

そしてマウスの自動操作において、マウスのボタンを押すと離すは別操作になります。

押す場合は最初の引数に&H2を指定し、離す場合は&H4を指定します。

マウスを押す場合はmouse_event(&H2, 0, 0, 0, 0)

マウスを離す場合はmouse_event(&H4, 0, 0, 0, 0)

押したままにしておくと、意図した操作にならない可能性がありますので注意してください。

クリックさせたい場合は、2つでセットになります。

これでTextBox1で指定したX座標とTextBox2で指定したY座標に移動し

その後、マウスをクリック(押す・離す)させる動作を自動化することができています。

ただ、マウスをクリックさせる操作は度々行うので、sub mouse_clickというサブプロシージャを作成します。

これで、クリックさせたい場合はmouse_click()を呼び出せばクリックさせることができます。

ただ指定した場所に移動して、クリックもしないだけの命令はない(もしかしたらある?)ので

移動させる命令と、クリックする命令を1つのプロシージャにします。

mouse_Clickを呼び出す際に、値渡しで引数を2つ指定しx座標とy座標を渡した値で実行するように設定します。

これで色々な場所をmouse_Clickで移動させてクリックをさせることが可能です。

しかし移動してクリックが1つの場合はこれで問題ありませんでしたが、複数にした場合はどうなるでしょうか。

このようにTextBoxを増やして次の座標を指定して移動させる場合、そのまますぐ動いてしまいます。

1回目の動作が終わり次第、即2回目の動作が実行されるのでクリックをさせた後少し動作を待機させたいものです。

ここまでのサンプルコード

-------------------------------------------------

Public Class Form1

'マウスイベントAPI宣言文
<System.Runtime.InteropServices.DllImport("USER32.DLL")>
Private Shared Sub mouse_event(
ByVal dwFlags As Integer, ByVal dx As Integer,
ByVal dy As Integer, ByVal cButtons As Integer,
ByVal dwExtraInfo As Integer)
End Sub


'Button1がクリックされた時に実行される命令
Private Sub Button1_Click_1(sender As Object, e As EventArgs) Handles Button1.Click

    '指定した座標に移動してマウス左クリック
    mouse_Click(TextBox1.Text, TextBox2.Text)

    '指定した座標に移動してマウス左クリック
    mouse_Click(TextBox3.Text, TextBox4.Text)

End Sub

'引数で指定された場所に移動してマウスを左クリックする命令
Private Sub mouse_Click(ByVal position_x As Integer, position_y As Integer)

    'Cursorのポジションプロパティでポジションを指定 X座標は渡されたposition_x、Y座標は渡されたposition_y
    Cursor.Position = New Point(position_x, position_y)

    'マウスの左ボタンを押す
    mouse_event(&H2, 0, 0, 0, 0)

    'マウスの左ボタンを離す
    mouse_event(&H4, 0, 0, 0, 0)

End Sub

End Class

-------------------------------------------------

動作を待機させるには、様々な方法がありますが、色々な機能を試したいので

ツールボックスからTimerを使用します。

説明にある通り、ユーザーが定義した間隔でイベントを発生させるコンポーネントです。

選択して、ユーザーフォームに追加しましょう。

追加すると、フォームの下の方にひっそりとTimerが追加されます。

Timer機能を使用したいのはクリックした後に、指定したミリ秒待機させたいので

マウスのクリック後に設定します。

まずTimer1.Intervalでタイマーのインターバルのミリ秒を指定します。

つまり1秒間隔で起動される形になります。

そして、その後Timer1.Enabled=trueでタイマーを起動します。

次にTimer1のTickイベントを指定します。

これは指定された間隔の時間が経過した時に発生するもので、先程インターバルを1000ミリ秒に指定し

Timerを起動したので、1000ミリ秒毎にこのTickイベントが発生します。

TickをダブルクリックしてTimer1_Tickのプロシージャを挿入します。

そして仕組みをつくる前に、最初にタイマー用の変数をcntという名前で用意します。

そして、タイマーを起動する前に、cntには0を入れておきます。

仕組みとしては、Timer1が起動し、インターバルで1秒経過する毎にcntを1ずつ増やしていき

cntが指定した数になったら、次の命令に進む形をとります。

cntはTimer1_Tickの中に入れて、インターバルが1000ミリ秒なので1秒毎にcntは1増えます。

そしてDo Whileを使用して条件を満たす間Loopさせます。

条件はcntが10より小さい間ループするというものにしておきます。

そうすれば、1000ミリ秒ごとに、cntが1増え、10回目にループを抜けるので

10秒待機する事ができます(厳密にいえば1つ1つの命令の間もあり100%10秒ではありませんが)

後はループを抜ければタイマーを停止するだけです。

ただ毎回同じ秒数で待機させるわけではないので、10の部分も引数で受け取った値だけ待機に変更します。

待機秒数用のTextBoxも作成し、並び替えます。

待機秒数用のTextBoxのテキストを渡してmouse_Clickを起動します。

mouse_Click側は、waittimeという変数で値を受け取り、ループの箇所の10をwaittimeに変更します。

これで呼び出す際に、TextBoxで指定した値の秒数だけ待機させることが可能です。

■ここまでのサンプルコード

------------------------------------------------------------------------------------

Public Class Form1

'マウスイベントAPI宣言文
<System.Runtime.InteropServices.DllImport("USER32.DLL")>
Private Shared Sub mouse_event(
ByVal dwFlags As Integer, ByVal dx As Integer,
ByVal dy As Integer, ByVal cButtons As Integer,
ByVal dwExtraInfo As Integer)
End Sub

'タイマー用の変数を用意
Dim cnt As Integer

'Button1がクリックされた時に実行される命令
Private Sub Button1_Click_1(sender As Object, e As EventArgs) Handles Button1.Click

    '指定した座標に移動してマウス左クリック
    mouse_Click(TextBox1.Text, TextBox2.Text, TextBox3.Text)

    '指定した座標に移動してマウス左クリック
    mouse_Click(TextBox4.Text, TextBox5.Text, TextBox6.Text)

End Sub

'引数で指定された場所に移動してマウスを左クリックする命令
Private Sub mouse_Click(ByVal position_x As Integer, position_y As Integer, ByVal waittime As Integer)

    'Cursorのポジションプロパティでポジションを指定 X座標は渡されたposition_x、Y座標は渡されたposition_y
    Cursor.Position = New Point(position_x, position_y)

    'マウスの左ボタンを押す
    mouse_event(&H2, 0, 0, 0, 0)

    'マウスの左ボタンを離す
    mouse_event(&H4, 0, 0, 0, 0)

    'タイマーのインターバルミリ秒を指定
    Timer1.Interval = 1000

    '初期値を設定する
    cnt = 0

    'タイマーを起動
    Timer1.Enabled = True

    'cntが指定した数より小さい間空ループ
    Do While cnt < waittime

        '制御を渡す
        Application.DoEvents()

    Loop

    'タイマーを停止
    Timer1.Enabled = False

End Sub

Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick

    'cntを今の数+1する
    cnt = cnt + 1

End Sub

End Class

------------------------------------------------------------------------------------

後は、細かい機能をつけていけば、もっと実用的になると思います。

動画ではもう少しだけ凝って作成してみてますので

良ければご視聴頂ければ幸いです。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です