【C#】初めてC#のPgm作ったその1<マウスを自動クリック回数間隔指定>

C#の練習用プログラム初回作りました。
※この記事は、VB.NETを2年間使ってきた後に、C#を始めた場合の例です。
VBから入門するほうが、VisualStudioのファイル操作が最小限でいいので、迷わずにすみます。
C#だと構文が、本格的なので、VBよりはるかに多くのファイルがあって、目が回ってしまいます。
●今回は、1か所の自動クリックですが、次回は、2か所の自動クリックにします。フォームは、2か所用で
作ってあります。ご自分でいじりながら遊んでに慣れる手もあると思います。
操作方法:位置を登録するには、CheckBox1(Locked1)のチェックを外してから指定位置で左ボタンクリックしてください。一旦クリックするとCheckBox1のチェックが入ってしまうので、登録は固定されます。(自動実行中は、マウスを動かしてはいけません)
exeのZIPファイル Mouse

●GITの使い方が未だわからないので、ソリューションファイルごとZIPでおいておきます。
Mouse3

●GISTで、ソースが見れるようにしました。
https://gist.github.com/dj1711572002/d7374cb1a7c4f1c161c6c32aec3dfb03

●Pgmの動作
DISPLAY全体範囲(フォーム内外範囲)で、マウスポインタの位置を決めて、指定の回数、指定時間間隔で左ボタンダウンー左ボタンアップを繰り返します。他のアプリ(ブラウザー等)を自動クリックできます。

●参考とさせていただいたC#のブログサイト様へ感謝
2か所のサイト様のサンプルプログラムを切った貼ったして作成しました。
できるだけオリジナルを消さないようにコメントアウトだけしてあります。何かあった場合に大事なので、

A:基本動作を教えていただいたサイト様感謝です。
Windowsの自動操作にチャレンジ!(その2) – マウスでクリックしてみよう
こちらの記事では、目標位置を決めてその位置に、マウスが軌跡を描いてうごいて、到着した左ボタンクリックすることを
自動で繰り返すプログラムです。
B:フォーム外のクリックイベントの拾い方を教えていただいたサイト様に感謝です。
【C#.net VB.net】フォーム外のクリックを取得する
これは、指定位置のカーソルを登録するために必要な動作です。一度クリックして登録してしまえば、マウスを動かしても大丈夫です。

A-1:これをフォーム初期化で宣言してマウスイベントの定義設定をおこなっておきます。

[DllImport(“USER32.dll”, CallingConvention = CallingConvention.StdCall)]
static extern void mouse_event(int dwFlags, int dx, int dy, int cButtons, int dwExtraInfo);
private const int MOUSEEVENTF_LEFTDOWN = 0x2;
private const int MOUSEEVENTF_LEFTUP = 0x4;
private const int MOUSEEVENTF_RIGHTDOWN = 0x8;
private const int MOUSEEVENTF_RIGHTUP = 0x10;
private const int MOUSEEVENTF_MIDDLEDOWN = 0x20;
private const int MOUSEEVENTF_MIDDLEUP = 0x40;

A-2:マウスの動作はこれです。

// マウスクリック
mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0);
System.Threading.Thread.Sleep(300);
mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0);

 300msecシステムのスリープをいれてますが、アプリ動作次第ですので、なくても動作します。

② Aのプログラムから所望の仕様に変更
所望の仕様1:クリックする位置を固定登録する動作
所望の仕様2:時間間隔を置いて繰り返しクリック動作
変更1:button1_Clickは、現在のマウス座標を取得してます。
private void button1_Click(object sender, EventArgs e) {
マウスを移動する動作は、要らないので、
// 目的位置までの移動量 以下の if(Math.abs   )文を全部コメントアウト
// マウス移動 もいらないので、コメントアウト
マウスクリックも入っているので、コメントアウトしておく。
}
変更2:指定位置にきたら1回だけ左ボタンおして、位置座標を登録して固定化したい。
このプログラムには、timer1_tick()が用意されてます。300msec周期で常に動く設定になってます。
private void timer1_Tick(object sender, EventArgs e)
{
ここに左ボタンクリックのイベント処理部分を入れ込みます。
}
Bのプログラムから左ボタンクリックのイベント処理部分を教えていただきました。
まず、クラス直下に  
Imports System.Runtime.InteropServices 宣言しておきます。
if (GetAsyncKeyState(Keys.LButton) != 0)で、左ボタンにイベントが発生したらif文に入ります。
checkBox1は、事前にマウス位置を登録したらtrueで、このif文は、初回の登録用なのでfalseのみ実行です。
登録は、textBox1に座標のS
tring変数を書き込んで行います。
登録が終わったら、checkBox1にチェックいれて、trueにして、このif文は、初回だけになります。

if (GetAsyncKeyState(Keys.LButton) != 0 && checkBox1.Checked==false)
{
if (flgClick == false && checkBox1.Checked==false)
{textBox1.Text = zahyou;
flgClick = true;checkBox1.Checked = true;
}
}

変更3:timer1_tick()が定期的な実行ルーチンなので、ここにすべての動作を入れ込みます。

if (GetAsyncKeyState(Keys.LButton) != 0 && checkBox1.Checked==false)//左ボタンクリックで位置登録
{}
else if (GetAsyncKeyState(Keys.RButton) != 0)//右ボタンクリックでSTOP
{}
else //何もイベントがない時は、ここを通過するので、ここに自動クリック部分いれる。
{
自動クリックは、指定時間間隔と指定回数クリックさせる}

変更4 自動クリック部分
・button1を押したら、startflag=trueにして、自動クリックが動作可能にします。
・DoClick()にマウス動作を関数化しましたが、短いので関数化しなくてもよかったです。
・intervalTは、comboBox1で指定された時間間隔msecです。
・iternでクリックの回数をカウントアップしてます。
・label2にクリック回数表示してます。
・Debug.Print用にタイムスタンプをつけてますが、ここは、不要なら消してください。
・ clickNは、comboBox2に指定された繰り返しクリック回数です。
・iterNがclickN以下ならstartflag=falseにして、この自動クリックに入れないようにします。

if (startflag == true)
{
DoClick();
System.Threading.Thread.Sleep(intervalT);
iterN++;
label2.Text = iterN.ToString();
DateTime now = DateTime.Now;
Debug.Print(“Timer1_Click:” + “iterN=” + iterN.ToString() + “sec=” + now.Second + “msec=” + now.Millisecond);
if (iterN >= clickN)
{
startflag = false;
}}

DoClick() 下げと上げの間の待ち時間は無しになってますが、必要な場合はいれてください。

private void DoClick()
{
mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0);
// System.Threading.Thread.Sleep(300);
mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0);
}

以上で、動作はするはずです。

●全体の構文
namespace Mouse {
public partial class Form1 : Form { //class直下にマウスイベントの宣言とグローバル変数宣言
public Form1() { }//FORM1の初期設定 comboBoxのaddItem等
private void Form1_Load(object sender, EventArgs e)`{   }// Form1をロードするだけ
private void button1_Click(object sender, EventArgs e){ }//自動クリックの開始、開始用変数設定
private void timer1_Tick(object sender, EventArgs e) { }//定期的に発生するのでここに全ての動作記述
private void DoClick() {  }//マウスクリックの動作実行

}

●はまった点
実験用にTeraTermのメニュー繰り返し押すデバッグをしていたのですが、このメニューは、一度クリックで開いて2度目のクリックで閉じる トグル式だったので、指定クリック数の半分しか動作しないのに気づきませんで、
指定回数の半分しか動作しないのがバグだと思い込んで、数時間迷っていてバカをしました。

 

 

コメントを残す

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