IT マウスマクロ

Logicoolマウスのマクロ作成(繰り返し処理のパターン)

投稿日:2019年4月30日 更新日:

Logicoolゲーミングマウスのマクロ(スクリプト)において繰り返し処理のパターンをいくつかご紹介させていただきます。

一定回数の繰り返し

一定の回数だけ処理を繰り返して終了するパターンです。

サンプルコード

nCnt = 0;	-- 処理回数を初期化する
-- 処理回数が 10 になるまで処理を繰り返す
while nCnt < 10 do
	
	-- 現在の処理回数をコンソールに出力する
	OutputLogMessage( "count=%d\n", nCnt );
	
	-- 処理回数をカウントアップする
	nCnt = nCnt + 1

end

解説

対象行 : 1 行目

nCnt = 0; -- 処理回数を初期化する

繰り返し処理(while と end で囲まれている部分)に入る前にカウンタを 0 で初期化しています。

対象行 : 3 ~ 11 行目

while nCnt < 10 do

(中略)

    -- 処理回数をカウントアップする
    nCnt = nCnt + 1

end

繰り返し処理の最後に処理回数をカウントアップし、カウントが 10 になると処理が終了するようになっています。

カウントアップする処理を忘れると無限ループとなってしまいますので注意しましょう。

特定キーが押されるまでの繰り返し

特定のキー(ctrl, shift, alt キー)が押されるまでの間、処理を繰り返すパターンです。

サンプルコード

-- ctrl キーが押されるまで処理を繰り返す
while not IsModifierPressed( "ctrl" ) do
	
	-- 現在の時刻を出力する
	OutputLogMessage( "Datetime=%s\n", GetDate( "%Y/%m/%d %H:%M:%S" ) );
	-- 1 秒(1000ミリ秒)待機する
	Sleep( 1000 );

end

解説

対象行 : 2 行目

while not IsModifierPressed( "ctrl" ) do

IsModifierPressed 関数で ctrl キーが押されているかどうかをチェックしています。
ctrl を指定していますが、shift や alt に書き換えることで、それぞれのキーの押下状態を取得することが可能です。
キー押されていないと false が返されますので、not で値を反転させて、押されていない間処理を繰り返すようにしています。

マウスボタンが押されている間の繰り返し

マウスボタン(左、中央、右)が押されている間、処理を繰り返すパターンです。
以下はマウスの左ボタンを押している間、現在時刻をコンソールに出力し続けるサンプルです。

サンプルコード

-- 左ボタンのクリックによるイベントの発生を有効化する
EnablePrimaryMouseButtonEvents( 1 );

function OnEvent(event, arg)
	-- OutputLogMessage("event = %s, arg = %s\n", event, arg);

	-- イベントが発生したボタン番号をチェックする
	if arg == 1 and event == "MOUSE_BUTTON_PRESSED" then
		-- 番号 1 のマウスボタン(左ボタン)でイベントが発生した場合
		
		-- 左ボタンが押されている間、処理を繰り返す
		while IsMouseButtonPressed( 1 ) do
			
			-- 現在の時刻を出力する
			OutputLogMessage( "Datetime=%s\n", GetDate( "%Y/%m/%d %H:%M:%S" ) );
			-- 1 秒(1000ミリ秒)待機する
			Sleep( 1000 );

		end

	end

end

解説

対象行 : 1 行目

EnablePrimaryMouseButtonEvents( 1 );

普通に PC を使っていると左クリックは頻繁に発生するため、性能面を考慮して通常は左ボタンのクリックでイベントが発生しないようになっています。
そのため、EnablePrimaryMouseButtonEvents(1) で左クリックでもイベントが発生するようにしています。
中央(マウスホイール)と右ボタンのクリックでは何もしなくてもイベントが発生しますので、左クリックでイベントを起こす必要がなければ EnablePrimaryMouseButtonEvents は実行しなくても構いません。

対象行 : 12 行目

while IsMouseButtonPressed( 1 ) do

IsMouseButtonPressed(1) で左ボタンが押されているかどうかをチェックし、while 文の繰り返し条件としています。
ちなみに、IsMouseButtonPressed で指定するパラメータは以下の通りとなっています。

対応するボタン パラメータ
左ボタン 1
中央(ホイール)ボタン 2
右ボタン 3

例えば、IsMouseButtonPressed(3) を実行すると、右ボタンが押されていれば true、押されていなければ false が取得できます。

特定の時間になるまでの繰り返し

特定の時間になるまで処理を繰り返すパターンです。

サンプルコード

------------------------
-- 処理を終了する日時の定義
------------------------
TIMER_MONTH = 4	-- 月
TIMER_DAY = 30	-- 日
TIMER_HOUR = 0	-- 時
TIMER_MIN = 13	-- 分
TIMER_SEC = 0	-- 秒

function OnEvent(event, arg)
	OutputLogMessage("event = %s, arg = %s\n", event, arg);

	-- イベントが発生したボタン番号をチェックする
	if arg == 4 and event == "MOUSE_BUTTON_PRESSED" then
		-- 番号 4 のマウスボタンでイベントが発生した場合

		-- 現在の日時を取得する
		datetime = GetDate( "*t" )	
		-- 指定した日時になるまで処理を繰り返す
		while not ( 
			 TIMER_MONTH <= datetime.month and
			 TIMER_DAY <= datetime.day and
			 TIMER_HOUR <= datetime.hour and
			 TIMER_MIN <= datetime.min and
			 TIMER_SEC <= datetime.sec ) do
			
			-- 現在の時刻を出力する
			OutputLogMessage( "Datetime=%s\n", GetDate( "%Y/%m/%d %H:%M:%S" ) );
			-- 1 秒(1000ミリ秒)待機する
			Sleep( 1000 );
			
			-- 現在の日時を取得する
			datetime = GetDate( "*t" );

		end

	end

end

解説

対象行 : 4 ~ 8 行目

TIMER_MONTH = 4 -- 月
TIMER_DAY = 30 -- 日
TIMER_HOUR = 0 -- 時
TIMER_MIN = 13 -- 分
TIMER_SEC = 0 -- 秒

最初に TIMER_* の各変数に処理の終了時間を定義しています。
日をまたいで処理を行わない場合は TIMER_MONTH と TIMER_DAY は不要です。
もし年をまたいで処理を行うのであれば TIMER_YEAR のような終了年を定義する変数も用意してください(たぶんいないと思いますが・・・)。

対象行 : 18 行目

datetime = GetDate( "*t" )

繰り返し処理に入る前に GetDate( "*t" ) で現在の日時を取得しています。繰り返し処理の判定時に数値として日時を扱う必要があるため、"*t" を指定してテーブル形式で現在日時を取得しています。
日時の取得については以下の記事で詳細に紹介していますので、ご参照ください。
Logicoolマウスのマクロ作成(日時取得編)

対象行 : 20 ~ 25 行目

while not (
    TIMER_MONTH <= datetime.month and
    TIMER_DAY <= datetime.day and
    TIMER_HOUR <= datetime.hour and
    TIMER_MIN <= datetime.min and
    TIMER_SEC <= datetime.sec ) do

while 文の条件式では 現在の月日と時分秒のすべてが事前に定義しておいた終了日時を超えていないかチェックすることで、終了日時となったかどうかを判定しています。
日をまたいで処理を行わない場合は TIMER_MONTH と TIMER_DAY との比較は不要です。
もし年をまたいで処理を行うのであれば終了年の変数(TIMER_YEAR など)との比較処理を追加してください。

対象行 : 33 行目

datetime = GetDate( "*t" )

繰り返し処理の最後に改めて日時を取得しなおしています。ここで再取得しないと 18 行目で取得した日時との比較が行われ、いつまで経っても処理が終わりませんのでご注意ください。

一定時間が経過するまでの繰り返し

一定時間が経過するまで処理を繰り返すパターンです。特定の時刻まで処理を行うのではなく、処理を開始してからの経過時間で判断しています。

サンプルコード

------------------------
-- 処理を繰り返す時間の定義
------------------------
TIMER_HOUR = 0	-- 時
TIMER_MIN = 1		-- 分
TIMER_SEC = 30	-- 秒

-- 繰り返し時間を秒単位に変換する
waitSec = TIMER_HOUR * 3600 + TIMER_MIN * 60 + TIMER_SEC

function OnEvent(event, arg)
	OutputLogMessage("event = %s, arg = %s\n", event, arg);

	-- イベントが発生したボタン番号をチェックする
	if arg == 4 and event == "MOUSE_BUTTON_PRESSED" then
		-- 番号 4 のマウスボタンでイベントが発生した場合

		-- 現在の時刻を秒単位で取得し、開始時間として記憶する
		startTime = ConvertCurrentTimeToSeconds()
		-- 繰り返し時間が経過するまで処理を繰り返す
		while not IsPastRepetitionTime( startTime, waitSec ) do
			
			-- 処理を開始してからの経過時間を出力する
			OutputLogMessage( "elapsed time=%d\n", ConvertCurrentTimeToSeconds() - startTime );
			-- 1 秒(1000ミリ秒)待機する
			Sleep( 1000 );

		end

	end

end

-- 現在の時刻を秒単位で取得する関数
function ConvertCurrentTimeToSeconds()
	
	-- 現在の時刻をテーブルで取得する
	dateTime = GetDate( "*t" )
	-- 秒単位に変換した現在の時刻を返す
	return dateTime.hour * 3600 + dateTime.min * 60 + dateTime.sec

end

-- 繰り返し時間を経過したかチェックする関数
function IsPastRepetitionTime( i_startTime, i_repetitionTime )
	-- 繰り返し時間を経過したかどうかを表すフラグ
	result = false

	-- 現在の時刻を秒単位で取得する
	currentTime = ConvertCurrentTimeToSeconds()

	-- 日付が変わると開始時刻の方が現在時刻よりも大きくなってしまうため、現在時刻に 24 時間分の秒数を加える
	if currentTime - i_startTime < 0 then

		currentTime = currentTime + 86400
	
	end

	-- 開始時間と現在時刻の差分の秒数が繰り返し時間以上となったかチェックする
	if i_repetitionTime <= currentTime - i_startTime then
		
		result = true	

	end

	-- 判定結果を返す
	return result

end

解説

グローバル

対象行 : 4 ~ 6 行目

TIMER_HOUR = 0 -- 時
TIMER_MIN = 1 -- 分
TIMER_SEC = 30 -- 秒

TIMER_* の各変数に処理を繰り返す時間を定義しています。

対象行 : 9 行目

waitSec = TIMER_HOUR * 3600 + TIMER_MIN * 60 + TIMER_SEC

処理を繰り返す時間を秒単位に変換しています。
1 分は 60 秒、1 時間は 3600 秒なので、それぞれ TIMER_MIN と TIMER_HOUR と掛けて秒数を算出しています。

OnEvnet 関数

対象行 : 19 行目

startTime = ConvertCurrentTimeToSeconds()

繰り返し処理に入る前に ConvertCurrentTimeToSeconds 関数で現在時刻を秒単位で取得しています。
ConvertCurrentTimeToSeconds は独自に定義した関数で、後ほど説明します。

対象行 : 21 行目

while not IsPastRepetitionTime( startTime, waitSec ) do

while 文の条件式では、独自に定義した IsPastRepetitionTime 関数を呼び出し、処理を開始してから繰り返し時間が経過したかを判定しています。
IsPastRepetitionTime 関数については後ほど説明します。

ConvertCurrentTimeToSeconds 関数

現在時刻を秒単位で取得するための独自に定義した関数です。

対象行 : 37 ~ 40 行目

-- 現在の時刻をテーブルで取得する
dateTime = GetDate( "*t" )
-- 秒単位に変換した現在の時刻を返す
return dateTime.hour * 3600 + dateTime.min * 60 + dateTime.sec

現在時刻を GetDate 関数でテーブルとして取得しています。
日時の取得については以下の記事で詳細に紹介していますので、ご参照ください。
Logicoolマウスのマクロ作成(日時取得編)

その後、時分秒を表すテーブルの各キーを足し合わせて、現在時刻を秒単位で返しています。
足し合わせる際、min(分)には 60 秒を、hour(時)には 3600 秒を掛けて、単位を秒に合わせています。

IsPastRepetitionTime 関数

繰り返し時間を経過したかチェックするための独自に定義した関数です。

対象行 : 45 行目

function IsPastRepetitionTime( i_startTime, i_repetitionTime )

第 1 引数の i_startTime は処理の開始時間を表します。
第 2 引数の i_repetitionTime は繰り返し時間を表します。

対象行 : 49 ~ 57 行目

-- 現在の時刻を秒単位で取得する
currentTime = ConvertCurrentTimeToSeconds()

-- 日付が変わると開始時刻の方が現在時刻よりも大きくなってしまうため、現在時刻に 24 時間分の秒数を加える
if currentTime - i_startTime < 0 then

    currentTime = currentTime + 86400

end

ConvertCurrentTimeToSeconds 関数を使って現在の時刻を秒単位で取得しています。
その後、現在時刻と開始時間の差を計算し、処理を開始してから日付をまたいでいないか判定しています。
日付をまたぐと 0 時に戻るため、現在時刻よりも開始時間の方が値が大きくなってしまいます。
そのため、日付をまたいでいる場合は 1 日分の秒数( 60 [秒] × 60 [分] × 24 [時間] = 86400 [秒])を現在時刻に足し、経過時間が正確に計算できるように調整しています。

対象行 : 59 ~ 67 行目

-- 開始時間と現在時刻の差分の秒数が繰り返し時間以上となったかチェックする
if i_repetitionTime <= currentTime - i_startTime then

    result = true

end

-- 判定結果を返す
return result

現在時刻と開始時間の差で経過時間を計算し(currentTime - i_startTime)、繰り返し時間(i_repetitionTime)を超えていないか判定しています。
繰り返し時間を超えている場合は、判定結果(result)を true に設定し、最後に判定結果を返しています。

その他のマクロ(スクリプト)関連ページはこちら

Logicoolゲーミングマウスのマクロ(スクリプト)関連ページ一覧

ディスプレイやキーボード・マウス 汚れていませんか?

皮脂や唾、手垢、汗などでディスプレイやキーボード・マウスが汚れていませんか? 衛生上の問題もありますし、気持ち良く使うためにも、こまめに拭きとってキレイにすることをオススメします。

エレコム クリーナー ウェットティッシュ 液晶用

  • 超極細分割繊維をメッシュ状に加工した不織布を採用し、やさしく拭くだけで汚れをしっかり落とす
  • 拭き跡が残りにくい
  • 帯電防止効果で拭いた後にホコリがつきにくい
  • ディスプレイの表面加工を傷めないノンアルコールタイプ

液晶用と書いてありますが、キーボード・マウスなどもキレイにできますし、タブレットやスマホなどにも使えます。
大容量なので 1つ置いておくだけでも、気付いた時にすぐ掃除ができて便利です。

おすすめのゲーミングマウス

超高速FPSゲーミングマウス(ボタン: 8 個)

Logicool ロジクール ゲーミング マウス G402

  • 500IPSを超えるトラッキング速度
  • 8個のプログラム可能なボタン
  • ボタンによるDPIの素早い切り替え
  • 1msのレポートレート
  • 高速なクリック(連打)を実現

高パフォーマンスのゲーミングマウス(ボタン: 11 個)

Logicool ロジクール ゲーミング マウス G502 HERO

  • 400IPSを超えるトラッキング速度
  • 11個のプログラム可能なボタン
  • 100~16,000の全DPIでゼロスムージング、ゼロフィルタリング、ゼロアクセラレーションを達成
  • 1msのレポートレート
  • マウスの重さを調整可能

15 個のプログラム可能なボタンを持つ高性能ワイヤレスマウス

Logicool G ゲーミングマウス ワイヤレス G604 ブラック

  • 400IPSを超えるトラッキング速度
  • 15個のプログラム可能なボタン
  • 100~16,000の全DPIでゼロスムージング、ゼロフィルタリング、ゼロアクセラレーションを達成
  • 1msのレポートレート
  • ワイヤレス

カスタマイズ可能な 20 個ものボタンを備える MMO 向けゲーミングマウス

Logicool ロジクール ゲーミング マウス G600t

  • MMO に最適な 20個のプログラム可能なボタン
  • 親指だけで 12個のボタンを瞬時に押せるサムパネル
  • 1msのレポートレート

スポンサーリンク

そういえば買いたい物があったんだった、日用品補充しなきゃ、などがあれば





おすすめ記事

1
Logicool(ロジクール)のゲーミングマウスではマクロを作って自動的な操作を実現することができます。 ボタン 1 つ押すだけで複雑な操作が自動で行えるようになり、定型的な操作を効率良く楽に行えるよ ...
2
バウヒュッテ(Bauhutte)のゲーミングチェア : RS-950RR の使用感などをレポートさせていただきたいと思います。一般的なオフィスチェアよりも断然座り心地が良く、私には合っていました。オス ...
3
キーボード・マウスでの操作に慣れているのに、PS4 や Xbox のコントローラで FPS/TPSゲームをプレイするとうまく操作できず、歯がゆい思いをされていないでしょうか。ゲームソフト側が対応してい ...

-IT, マウスマクロ

Copyright© ArekoReport , 2020 All Rights Reserved.