G300Sでクリック連打のスクリプト・マクロを作成してみた

 ここではゲーミングマウスのG300Sマウスで、クリック連打のスクリプトを作成したみたので紹介したいと思います。

G300Sマウスとは

G300Sはlogicoolから発売されているゲーミングマウスで、エントリーモデル的な位置づけのものです。

価格.comのランキングでは、5位圏内に入っている人気商品です。

調べた時点では、Amazonで2500円くらいで購入できるお手頃な価格です。

特徴はシンプルなデザインとLEDで点灯すること、9個のプログラム設定可能なボタンがあることです。

そしてオンボードメモリを搭載していることです。
オンボードメモリを搭載することで、マウスに各ボタンを押したときの動作やプログラムを記憶させることが出来ます。

クリック連打をスクリプト・マクロで実行する理由

クリック連打は、マウスに操作を記憶させる方法の他にも、クリック連打用のソフトウェアをインストールすることで実行することが出来ます。

ただし、ほとんどのPCゲームでは、ソフトウェアからの連打は無効化されます。ほとんどのPCゲームではプロテクトがかかっていて、ソフトウェからの操作などの不正っぽいアクションは実行できません。

そこでオンボードメモリの登場です。
マウス自体に操作を記憶させておけば、PCゲームはマウス側からきちんと操作が行われたと判断してクリック連打やマクロなどを認識してくれます。

このため、ゲーミングマウスには操作を記憶することが出来るメモリが搭載されています。

スクリプトとマクロの違い

一般的にスクリプトとは、プログラムソースを自分でコーディングして作ったプログラムを指します。

マクロとはある操作を記録したものを指します。

ゲーミングマウスでマクロを作成するときは、自分で動かした操作を記録するものもあれば、既に用意されたアクションをセットしていくものもあります。

クリック連打のスクリプト

ここからはクリック連打のスクリプトを紹介したいと思います。

「g300sr スクリプト」で検索すると既にスクリプトを作成している方がいたので、そのままコピペしてみたのですが、コンパイルエラーになりました。

もしかするとAPIのバージョンが上がって引数とかが変わったのかもしれません。

というわけで、書いてみました。

function OnEvent(event, arg ,family)
 if (event == "MOUSE_BUTTON_RELEASED" and arg == 7) then
  if(GetMKeyState(family) == 2) then
    for i = 0, 100 do
        PressMouseButton(1)
        ReleaseMouseButton(1)
    end
  end
 end
end

参考にした方のソースと違う点は主に「function OnEvent(event, arg ,family)」と「if(GetMKeyState(family) == 2) then」のところです。どうやらfamilyという引数がないとエラーになるようです。

「if (event == “MOUSE_BUTTON_RELEASED” and arg == 7) then」でボタンがクリックされたとき、そして7番のボタン(マウスの右奥)が押されたときにアクションを実行することを意味しています。

どうやらlogicoolはゲーミングマウスだけでなくキーボードも発売しており、このスクリプトでは、どのデバイスで動作が実行されたか判断する必要があるようです。

次に「if(GetMKeyState(family) == 2) then」として、マウスのモードが2の状態の場合に処理を実行するように記述しています。確か、モードは0,1,2の3パターンだったと思います。

「for i = 0, 100 do~end」でdoからendまでの処理をカウンタ変数が0から100になるまで繰り返します。
100のところを変更すれば連打回数を変更できます。

あとは「PressMouseButton(1)」、「ReleaseMouseButton(1)」でボタンを押して、放すという操作を実行しています。
押して、離すまでに待ちを作りたい場合は「Sleep(ミリ秒)」を追加します。

クリックごとに時間を空ける方法

例えば、1回クリックした後に5秒の間隔を空けたい場合は、Sleepを使います。

クリックの操作の後に、「Sleep(5000)」とすることで5000ミリ秒の処理を待機させることが出きます。

function OnEvent(event, arg ,family)
 if (event == "MOUSE_BUTTON_RELEASED" and arg == 7) then
  if(GetMKeyState(family) == 2) then
    for i = 0, 100 do
        PressMouseButton(1)
        ReleaseMouseButton(1)
        Sleep(5000)
      end
    end
  end
 end
end

クリック連打を途中で抜ける方法

クリック連打を途中で抜ける方法を考えたのですが、パッと思いつきませんでしたので、FOR文の繰り返し実行処理の中にIF文を追加してみました。

「if(GetMKeyState(family) == 2) then 」と「else return」です。

つまり、繰り返し処理を実行している間にモードが変更された場合は、繰り返し処理を中断します。

なのでmodeボタンを押せばクリック連打は止まります。

もう少し良い方法があるとは思いますが、とりあえずこれで動くことは確認しました。

function OnEvent(event, arg ,family)
 if (event == "MOUSE_BUTTON_RELEASED" and arg == 7) then
  if(GetMKeyState(family) == 2) then
    for i = 0, 100 do
      if(GetMKeyState(family) == 2) then 
        PressMouseButton(1)
        ReleaseMouseButton(1)
      else
        return
      end
    end
  end
 end
end