前回の記事で分かった課題は大きく分けて2つです。
1.(おそらく)条件分岐が多岐にわたると、処理が重くなり安定して動作しない
2.複数同時押しと並行して単打を実装するのが難しい
1に関してはコードを複数のファイルへ分割し呼び出す方法である程度解決しそうです。2はこれからです。
追記
IMEオンで同時押しを、IMEオフで単打を出力してはどうかと考えました。AutoHotkeyのホットストリングで実装するとこんな感じです。
#include ime.ahk #If !IME_GET() :*?:r::し :*?:j::あ :*?:i::る Space & r:: clipboard = め Send, ^v Return Space & j:: clipboard = の Send, ^v Return ~f & g:: ~g & f:: Send,!{F1} IME_SET(1) Return #If IME_GET() ~h & j:: ~j & h:: Send,!{F2} IME_SET(0) Return
メイン側
CALL JYO.uws CALL JYU.uws CALL JYA.uws PUBLIC MAIN_FL=1 PUBLIC RJ_FL=0 WHILE 1 IF GETKEYSTATE(VK_R) and (GETKEYSTATE(VK_I) or GETKEYSTATE(VK_P) or GETKEYSTATE(VK_H)) then sleep(0.125) thread JYO.JYO_MAIN MAIN_FL=0 ELSEIF (GETKEYSTATE(VK_R) and GETKEYSTATE(VK_J)) and !(GETKEYSTATE(VK_I) or GETKEYSTATE(VK_P) or GETKEYSTATE(VK_H)) then SENDSTR(GETID(GET_ACTIVE_WIN),"じ") RJ_FL=1 sleep(0.125) ENDIF IF GETKEYSTATE(VK_R) and GETKEYSTATE(VK_J) and GETKEYSTATE(VK_I) then IF RJ_FL>0 SENDSTR(GETID(GET_ACTIVE_WIN),"ょ") RJ_FL=0 sleep(0.125) ELSEIF MAIN_FL>0 SENDSTR(GETID(GET_ACTIVE_WIN),"じょ") MAIN_FL=0 ENDIF ENDIF WEND
サブ側
CLASS JYO PROCEDURE JYO_MAIN PUBLIC RJI_FL=0 PUBLIC RJP_FL=0 PUBLIC RJH_FL=0 PUBLIC RJ_FL=0 PUBLIC RI_FL=0 PUBLIC RP_FL=0 PUBLIC RH_FL=0 PUBLIC TN_FL=0 WHILE GETKEYSTATE(VK_R) TN_FL=1 IF GETKEYSTATE(VK_I) AND GETKEYSTATE(VK_J) RJI_FL=1 RI_FL=0 sleep(0.125) EXIT ELSEIF GETKEYSTATE(VK_I) RI_FL=1 sleep(0.25) ENDIF WEND IF RI_FL>0 then SENDSTR(GETID(GET_ACTIVE_WIN),"しょ") RI_FL=0 ELSEIF RJI_FL>0 then SENDSTR(GETID(GET_ACTIVE_WIN),"じょ") RJI_FL=0 ENDIF FEND ENDCLASS