前頁のスクリプトその1は、現在のモードがなんであれ、G15キーを押すとM2に、離すとM1に戻ってしまうという単純にすぎるものでした。殆どの場合それで十分という気もするんですが、以下ではもう少し高機能なスクリプトを載せています。

特定のキーを押している間だけモードを切り替えるスクリプト(その2)

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

特定のキーを押している間だけモードを切り替えるスクリプト(その3)

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

スクリプトのテキストファイルはココをクリック。

モードを切り替えるスクリプトでは単純で汎用性の高いものです。これで大概間に合うんじゃないかしらん?

特定のキーを押している間だけモードを切り替えるスクリプト(その4)

現在のモードが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

スクリプトのテキストファイルはココをクリック。

特定のキーを押すたびにモードを1→2→3→1…とサイクルさせるスクリプト

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" }

押すたびに出力されるキーが切り替わるスクリプト(その1)

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" }

押すたびに出力されるキーが切り替わるスクリプト(その2)

前述の押すたびに出力されるキーが切り替わるスクリプト(その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()が最大値を返した後の例外処理を省いてあります…。(´・ω・`)


次のページヘ(実用性がなくただ自己満足な方向にブレていくスクリプトを載せています)

目次に戻る