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 は実行しなくても構いません。
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 のような終了年を定義する変数も用意してください(たぶんいないと思いますが・・・)。
datetime = GetDate( "*t" )
繰り返し処理に入る前に GetDate( "*t" ) で現在の日時を取得しています。繰り返し処理の判定時に数値として日時を扱う必要があるため、"*t" を指定してテーブル形式で現在日時を取得しています。
日時の取得については以下の記事で詳細に紹介していますので、ご参照ください。
Logicoolマウスのマクロ作成(日時取得編)
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 など)との比較処理を追加してください。
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 は独自に定義した関数で、後ほど説明します。
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 は繰り返し時間を表します。
-- 現在の時刻を秒単位で取得する
currentTime = ConvertCurrentTimeToSeconds()
-- 日付が変わると開始時刻の方が現在時刻よりも大きくなってしまうため、現在時刻に 24 時間分の秒数を加える
if currentTime - i_startTime < 0 then
currentTime = currentTime + 86400
end
ConvertCurrentTimeToSeconds 関数を使って現在の時刻を秒単位で取得しています。
その後、現在時刻と開始時間の差を計算し、処理を開始してから日付をまたいでいないか判定しています。
日付をまたぐと 0 時に戻るため、現在時刻よりも開始時間の方が値が大きくなってしまいます。
そのため、日付をまたいでいる場合は 1 日分の秒数( 60 [秒] × 60 [分] × 24 [時間] = 86400 [秒])を現在時刻に足し、経過時間が正確に計算できるように調整しています。
-- 開始時間と現在時刻の差分の秒数が繰り返し時間以上となったかチェックする
if i_repetitionTime <= currentTime - i_startTime then
result = true
end
-- 判定結果を返す
return result
現在時刻と開始時間の差で経過時間を計算し(currentTime - i_startTime)、繰り返し時間(i_repetitionTime)を超えていないか判定しています。
繰り返し時間を超えている場合は、判定結果(result)を true に設定し、最後に判定結果を返しています。
Logicoolゲーミングマウスのマクロ(スクリプト)関連ページ一覧
皮脂や唾、手垢、汗などで表面は見えない雑菌だらけです。 衛生上も問題ですし、気持ち良く使うためにも、こまめに拭きとってキレイにしましょう。