前頁のスクリプトその1は、現在のモードがなんであれ、G15キーを押すとM2に、離すとM1に戻ってしまうという単純にすぎるものでした。殆どの場合それで十分という気もするんですが、以下ではもう少し高機能なスクリプトを載せています。
G8キーでM1からM2に、G15キーでM1からM3にシフトするスクリプトです。基本のモードをM1にセットして利用することを前提としているため、プロファイルロード時に自動的にM1になります。
-- シフトキーとモード
KEYMAP = {}
KEYMAP[ 8] = 2
KEYMAP[15] = 3
SHIFT = 1
function OnEvent( event, arg, family )
-- プロファイルロード時の初期化処理
if ( event == "PROFILE_ACTIVATED" ) then
SetMKeyState( SHIFT, "lhc" )
end
-- シフトキーが押されている間だけ、モードを切り替える
if ( family == "lhc" and KEYMAP[ arg ] ~= nil ) then
if ( event == "G_PRESSED" ) then
SetMKeyState( KEYMAP[ arg ], "lhc" )
elseif ( event == "G_RELEASED" ) then
SetMKeyState( SHIFT, "lhc" )
end
end
end
スクリプトのテキストファイルはココをクリック。
4-5行目の KEYMAP[ key ] = mode が動作を指定する部分です。例えば、G1キーを押した時にM2に移行して欲しいなら、以下のように記述します。
KEYMAP[ 1] = 2
G15キーを押している間だけM2にシフトします。離すと元のモードに戻ります。現在のモードがM1の時にG15キーを押すとM1からM2に、M3の時にG15キーを押すとM3からM2にシフトすることになります。2行目の SHIFT_KEY の値を書き換えることで、任意のキーにシフト機能を割り当てられます。また、3行目の SHIFT の値を書き換えれば、シフト先のモード番号を変更できます。
-- シフトキーとシフトするモード
SHIFT_KEY = 15
SHIFT = 2
function OnEvent( event, arg, family )
-- プロファイルロード時の初期化処理
if ( event == "PROFILE_ACTIVATED" ) then
mkey = GetMKeyState( "lhc" )
end
-- シフトキーが押されている間だけ、モードを切り替える
if ( family == "lhc" and arg == SHIFT_KEY ) then
if ( event == "G_PRESSED" ) then
mkey = GetMKeyState( "lhc" )
SetMKeyState( SHIFT, "lhc" )
elseif ( event == "G_RELEASED" ) then
SetMKeyState( mkey, "lhc" )
end
end
end
スクリプトのテキストファイルはココをクリック。
モードを切り替えるスクリプトでは単純で汎用性の高いものです。これで大概間に合うんじゃないかしらん?
現在のモードがM2の場合に限り、G15キーを押している間だけM3にシフトし、離すとM2に戻ります。これは、現在のモードがM1のときはシフトの影響を受けず、G15キーに別の機能を割り振ることができるということを意味しています。2行目の SHIFT_KEY の値を書き換えることで、任意のキーにシフト機能を割り当てることができます。
-- シフトキーとシフトするモード
SHIFT_KEY = 15
FROM = 2
TO = 3
function OnEvent( event, arg, family )
-- プロファイルロード時の初期化処理
if ( event == "PROFILE_ACTIVATED" ) then
flag = false
end
-- シフトキーが押されている間だけ、モードを切り替える
if ( family == "lhc" and arg == SHIFT_KEY ) then
if ( event == "G_PRESSED" and GetMKeyState( "lhc" ) == FROM ) then
SetMKeyState( TO, "lhc" )
flag = true
elseif ( event == "G_RELEASED" and flag == true ) then
SetMKeyState( FROM, "lhc" )
flag = false
end
end
end
スクリプトのテキストファイルはココをクリック。
G8キーを押すたびにモードが1→2→3→1…と順繰りに巡っていきます。2行目の CYCLE_KEY の値を書き換えることで、任意のキーにサイクル機能を割り当てることができます。
-- サイクルキーをセット
CYCLE_KEY = 8
function OnEvent( event, arg, family )
-- サイクルキーが押されるたびにモードを1つ進める
if ( family == "lhc" and event == "G_PRESSED" and arg == CYCLE_KEY ) then
mkey = GetMKeyState( "lhc" ) + 1
if ( mkey > 3 ) then
mkey = 1
end
SetMKeyState( mkey, "lhc" )
end
end
スクリプトのテキストファイルはココをクリック。
マウスの第4ボタンを押している間だけM2にシフトします。離すと元のモードに戻ります。特定のキーを押している間だけモードを切り替えるスクリプト(その3)のマウスボタンバージョンです。ただし、LogicoolゲームソフトウェアがサポートするLogicool製ゲーミングマウス(G300とかG400など)でないと機能しません。2行目の SHIFT_KEY の値を書き換えることで、任意のマウスボタンにシフト機能を割り当てることができます。なお、左ボタン(値1)は使用出来ません(EnablePrimaryMouseButtonEvents( true ) を挿入することで使えるようになるんですが、まんどいので説明しません・_・)。
-- シフトキーとシフトするモード
SHIFT_KEY = 4
SHIFT = 2
FAMILY = "mouse"
EVENT_PRESSED = "MOUSE_BUTTON_PRESSED"
EVENT_RELEASED = "MOUSE_BUTTON_RELEASED"
function OnEvent( event, arg, family )
-- プロファイルロード時の初期化処理
if ( event == "PROFILE_ACTIVATED" ) then
mkey = GetMKeyState( "lhc" )
end
-- シフトキーが押されている間だけ、モードを切り替える
if ( family == FAMILY and arg == SHIFT_KEY ) then
if ( event == EVENT_PRESSED ) then
mkey = GetMKeyState( "lhc" )
SetMKeyState( SHIFT, "lhc" )
elseif ( event == EVENT_RELEASED ) then
SetMKeyState( mkey, "lhc" )
end
end
end
スクリプトのテキストファイルはココをクリック。
ところで、5−7行目を以下のように書き換えると、マウスボタンではなくGキーでモード切替できるようになります(G4キーを押している間だけM2にシフトするようになります)。要するに、特定のキーを押している間だけモードを切り替えるスクリプト(その3)と同じ動作に戻ります。スクリプトがどのようにマウスボタンとGキーを見分けているのか、なんとなくわかってもらえたでしょうか。
FAMILY = "lhc"
EVENT_PRESSED = "G_PRESSED"
EVENT_RELEASED = "G_RELEASED"
G8キーを押すたびに左コントロールキーが、G15キーを押すたびに左シフトキーとSキーが、OnとOffでトグルされます。
-- トグルキーと出力されるキー
KEYMAP = {}
KEYMAP[ 8] = { "lctrl" }
KEYMAP[15] = { "lshift", "s" }
key_switch = {}
function OnEvent( event, arg, family )
if ( family == "lhc" and KEYMAP[ arg ] ~= nil and event == "G_PRESSED" ) then
if ( key_switch[ arg ] ~= true ) then
PressKey( unpack( KEYMAP[ arg ] ) )
key_switch[ arg ] = true
else
ReleaseKey( unpack( KEYMAP[ arg ] ) )
key_switch[ arg ] = false
end
end
end
スクリプトのテキストファイルはココをクリック。
例えば、新たにG20キーに左コントロールキーと左シフトキーとSキーのトグル機能を付与したい場合、4-5行目を以下のように改変します。G20キーを押すたびにこれら3つのキーがOnとOffでトグルされます。指定には正確なKeynameまたはScancodeが必要です。G-seriesLuaAPI.pdf(デフォルトでは C:\Program Files\Logicool Gaming Software\Resources\Doc 下)のAppendix Aを参照してください。
KEYMAP[ 8] = { "lctrl" }
KEYMAP[15] = { "lshift", "s" }
KEYMAP[20] = { "lctrl", "lshift", "s" }
G8キーを押すたびに1→2→a→b→1…、G15キーを押すたびにPrintScreen→左コントロールキー→PrintScreen…と順繰りに出力されます。
-- 切り替えキーと出力されるキー
KEYMAP = {}
KEYMAP[ 8] = { "1", "2", "a", "b" }
KEYMAP[15] = { 0x137, "lctrl" }
key_switch = {}
-- イベントハンドラ
function OnEvent( event, arg, family )
if ( event == "PROFILE_ACTIVATED" ) then
-- キースイッチの初期化
for i = 1, 25 do
key_switch[ i ] = 0
end
end
if ( family == "lhc" and KEYMAP[ arg ] ~= nil ) then
if ( event == "G_PRESSED" ) then
key_switch[ arg ] = key_switch[ arg ] + 1
if ( key_switch[ arg ] > #KEYMAP[ arg ] ) then
key_switch[ arg ] = 1
end
PressKey( KEYMAP[ arg ][ key_switch[ arg ] ] )
elseif ( event == "G_RELEASED" ) then
ReleaseKey( KEYMAP[ arg ][ key_switch[ arg ] ] )
end
end
end
スクリプトのテキストファイルはココをクリック。
例えば、新たにG20キーに切り替え機能を付与したい場合、4-5行目を以下のように改変します。G20キーを押すたびにzとxが交互に出力されるでしょう。出力されるキーの指定にはKeynameだけでなく、Scancodeも使えます。例えば、0x137は"printscreen"と同義です。
KEYMAP[ 8] = { 0x02, 0x03, "a", "b" }
KEYMAP[15] = { 0x137, "lctrl" }
KEYMAP[20] = { "z", "x" }
前述の押すたびに出力されるキーが切り替わるスクリプト(その1)に「一定時間入力がないと出力されるキーが先頭に戻る」機能を追加します。
以下のサンプルでは、G8キーを押すたびに1→2→3→4→5→1…と順繰りに出力されますが、G8キーを1000ms(1秒)以上押さないでいると、次にG8キーを押した時の出力が1に戻ります。同様にG15キーも押すたびにa→b→c→d→a…と順繰りに出力されますが、G15キーを1000ms以上押さないでいると、次にG15キーを押した時の出力はaに戻ります。
-- 切り替えキーと出力されるキー
KEYMAP = {}
KEYMAP[ 8] = { "1", "2", "3", "4", "5" }
KEYMAP[15] = { "a", "b", "c", "d" }
INTERVALTIME = 1000
-- イベントハンドラ
function OnEvent( event, arg, family )
-- プロファイルロード時の初期化処理
if ( event == "PROFILE_ACTIVATED" ) then
-- キースイッチと前回時刻の初期化
nowtime = GetRunningTime()
key_map = {}
for i = 1, 25 do
key_map[ i ] = {
keys = KEYMAP[ i ],
switch = 0,
time = nowtime
}
end
end
if ( family == "lhc" and key_map[ arg ].keys ~= nil ) then
if ( event == "G_PRESSED" ) then
if ( GetRunningTime() - key_map[ arg ].time < INTERVALTIME ) then
key_map[ arg ].switch = key_map[ arg ].switch + 1
if ( key_map[ arg ].switch > #key_map[ arg ].keys ) then
key_map[ arg ].switch = 1
end
else
key_map[ arg ].switch = 1
end
PressKey( key_map[ arg ].keys[ key_map[ arg ].switch ] )
elseif ( event == "G_RELEASED" ) then
ReleaseKey( key_map[ arg ].keys[ key_map[ arg ].switch ] )
key_map[ arg ].time = GetRunningTime()
end
end
end
スクリプトのテキストファイルはココをクリック。
出力がリセットされるまでの時間は、7行目の INTERVALTIME 変数にミリ秒単位で指定します。例えば0.5秒(500ミリ秒)にしたいなら、以下のように改変します。
INTERVALTIME = 500
新たなキーを追加する方法はその1と同じです。なお、このプログラムはGetRunningTime()が最大値を返した後の例外処理を省いてあります…。(´・ω・`)
次のページヘ(実用性がなくただ自己満足な方向にブレていくスクリプトを載せています)