;============================= ; タイマー入り 同時打鍵スクリプト ;  + IME 状態チェック GUIThreadInfo 利用バージョン ; ; [注意] ; IE や Firefox などの右クリックやシステムメニューで IME チェックがだまされることがあります ; 「:」キーはこのスクリプトでは変更されません。別途設定してください ; 記号シフトがいい加減です(詳しくは L.411-450 ) ; Ctrl+Esc でスクリプトの停止・再開ができます ; ;============================= ; Maximal Gap Time は同時打鍵判定用の時定数です ; この時間(ms)内に次の入力があった場合は「同時」と見なします MaximalGT:=80 ; Single Key Wait はキーを押してからタイマーで確定するまでの時間です SingleKeyWait:=MaximalGT ; 以下でシングルストロークで send する文字列を定義します singleStroke_Q=け singleStroke_W=- singleStroke_E=こ ;こ singleStroke_R=て ;て singleStroke_T=さ singleStroke_Y=ひ singleStroke_U=ん ;ん singleStroke_I=り ;り singleStroke_O=づ singleStroke_P=つ singleStroke_AT=ヴ ;う゛ singleStroke_A=か singleStroke_S=は singleStroke_D=し ;し singleStroke_F=と ;と singleStroke_G=た ;た singleStroke_H=く ;く singleStroke_J=う ;う singleStroke_K=い ;い singleStroke_L=き singleStroke_SColon=の singleStroke_Z=せ ;せ singleStroke_X=お ;お singleStroke_C=に ;に singleStroke_V=な ;な singleStroke_B=ぽ singleStroke_N=っ ;っ singleStroke_M=る ;る singleStroke_Comma=す ;す singleStroke_Dot=へ singleStroke_Slash=ら singleStroke_BackSlash=つの ; 以下は IME がローマ字モードじゃないときに出力する文字です defaultKey_Q=q defaultKey_W=w defaultKey_E=e defaultKey_R=r defaultKey_T=t defaultKey_Y=y defaultKey_U=u defaultKey_I=i defaultKey_O=o defaultKey_P=p defaultKey_AT=@ defaultKey_A=a defaultKey_S=s defaultKey_D=d defaultKey_F=f defaultKey_G=g defaultKey_H=h defaultKey_J=j defaultKey_K=k defaultKey_L=l defaultKey_SColon=`; defaultKey_Colon=`: defaultKey_Z=z defaultKey_X=x defaultKey_C=c defaultKey_V=v defaultKey_B=b defaultKey_N=n defaultKey_M=m defaultKey_Comma=`, defaultKey_Dot=. defaultKey_Slash=/ defaultKey_BackSlash=\ ; 各キーに同時打鍵判定のための識別フラグをわりあてます flag_Q:=1 flag_W:=1<<1 flag_E:=1<<2 flag_R:=1<<3 flag_T:=1<<4 flag_Y:=1<<5 flag_U:=1<<6 flag_I:=1<<7 flag_O:=1<<8 flag_P:=1<<9 flag_A:=1<<10 flag_S:=1<<11 flag_D:=1<<12 flag_F:=1<<13 flag_G:=1<<14 flag_H:=1<<15 flag_J:=1<<16 flag_K:=1<<17 flag_L:=1<<18 flag_SColon:=1<<19 flag_Z:=1<<20 flag_X:=1<<21 flag_C:=1<<22 flag_V:=1<<23 flag_B:=1<<24 flag_N:=1<<25 flag_M:=1<<26 flag_Comma:=1<<27 flag_Dot:=1<<28 flag_Slash:=1<<30 flag_AT:=1<<31 flag_Colon:=1<<32 flag_Home:=1<<33 flag_End:=1<<34 flag_BackSlash:=1<<35 ; 同時打鍵の定義 ;;; 中指シフト kCmb1:=flag_F|flag_J ; を resultOfKCmb1=を kCmb2:=flag_K|flag_Q resultOfKCmb2=み kCmb3:=flag_K|flag_W resultOfKCmb3=ぁ kCmb4:=flag_K|flag_E ; え resultOfKCmb4=え kCmb5:=flag_K|flag_R ; や resultOfKCmb5=や kCmb6:=flag_K|flag_T resultOfKCmb6=ぉ kCmb7:=flag_K|flag_A resultOfKCmb7=れ kCmb8:=flag_K|flag_S resultOfKCmb8=ろ kCmb9:=flag_K|flag_D ; も resultOfKCmb9=も kCmb10:=flag_K|flag_F ; あ resultOfKCmb10=あ kCmb11:=flag_K|flag_G ; よ resultOfKCmb11=よ kCmb12:=flag_K|flag_Z ; ぇ resultOfKCmb12=ぇ kCmb13:=flag_K|flag_C resultOfKCmb13=ち kCmb14:=flag_K|flag_V ; ほ resultOfKCmb14=ほ kCmb15:=flag_K|flag_B resultOfKCmb15=ぃ kCmb16:=flag_D|flag_Y resultOfKCmb16=ぴ kCmb17:=flag_D|flag_U ; ぬ resultOfKCmb17=ぬ kCmb18:=flag_D|flag_I ; そ resultOfKCmb18=そ kCmb19:=flag_D|flag_O resultOfKCmb19=ゎ kCmb20:=flag_D|flag_P resultOfKCmb20=ふ kCmb21:=flag_D|flag_H ; め resultOfKCmb21=め kCmb22:=flag_D|flag_J ; わ resultOfKCmb22=わ kCmb23:=flag_D|flag_SColon ; ゆ resultOfKCmb23=ゆ kCmb24:=flag_D|flag_N resultOfKCmb24=ぅ kCmb25:=flag_D|flag_M ; む resultOfKCmb25=む kCmb26:=flag_D|flag_Comma ; ゃ resultOfKCmb26=ゃ kCmb27:=flag_D|flag_Dot ; ゅ resultOfKCmb27=ゅ kCmb28:=flag_D|flag_Slash ; ょ resultOfKCmb28=ょ ;;; 薬指シフト kCmb29:=flag_L|flag_W resultOfKCmb29=ぱ kCmb30:=flag_L|flag_E ; ご resultOfKCmb30=ご kCmb31:=flag_L|flag_R ; で resultOfKCmb31=で kCmb32:=flag_L|flag_T resultOfKCmb32=ざ kCmb33:=flag_L|flag_A resultOfKCmb33=が kCmb34:=flag_L|flag_S resultOfKCmb34=ば kCmb35:=flag_L|flag_D ; じ resultOfKCmb35=じ kCmb36:=flag_L|flag_F ; ど resultOfKCmb36=ど kCmb37:=flag_L|flag_G ; だ resultOfKCmb37=だ kCmb38:=flag_L|flag_Z ; ぜ resultOfKCmb38=ぜ kCmb39:=flag_L|flag_X ; ね resultOfKCmb39=ね kCmb40:=flag_L|flag_C resultOfKCmb40=ぢ kCmb41:=flag_L|flag_V ; ぼ resultOfKCmb41=ぼ kCmb42:=flag_L|flag_B ; この部分を空白にする resultOfKCmb42= kCmb43:=flag_S|flag_U ; ぷ resultOfKCmb43=ぷ kCmb44:=flag_S|flag_I ; ぞ resultOfKCmb44=ぞ kCmb45:=flag_S|flag_P resultOfKCmb45=ぶ kCmb46:=flag_S|flag_H ; ぐ resultOfKCmb46=ぐ kCmb47:=flag_S|flag_J ; ま resultOfKCmb47=ま kCmb48:=flag_S|flag_SColon ; ぎ resultOfKCmb48=ぎ kCmb49:=flag_S|flag_N ; この部分を空白にする resultOfKCmb49= kCmb50:=flag_S|flag_M ; ぺ resultOfKCmb50=ぺ kCmb51:=flag_S|flag_Comma ; ず resultOfKCmb51=ず kCmb52:=flag_S|flag_Dot resultOfKCmb52=べ ;;; 拗音シフト kCmb53:=flag_I|flag_R ; しゃ resultOfKCmb53=しゃ kCmb54:=flag_I|flag_F ; しょ resultOfKCmb54=しょ kCmb55:=flag_I|flag_V ; しゅ resultOfKCmb55=しゅ kCmb56:=flag_I|flag_T ; ちゃ resultOfKCmb56=ちゃ kCmb57:=flag_I|flag_G ; ちょ resultOfKCmb57=ちょ kCmb58:=flag_I|flag_B ; ちゅ resultOfKCmb58=ちゅ kCmb59:=flag_I|flag_A resultOfKCmb59=それ kCmb60:=flag_I|flag_Z ; くぃ resultOfKCmb60=くぃ kCmb61:=flag_I|flag_X resultOfKCmb61=なと kCmb62:=flag_I|flag_C ; くぉ resultOfKCmb62=くぉ kCmb63:=flag_I|flag_Q ; くゎ resultOfKCmb63=くゎ kCmb64:=flag_I|flag_W ; きぇ resultOfKCmb64=きぇ kCmb65:=flag_I|flag_E ; すぃ resultOfKCmb65=すぃ kCmb66:=flag_E|flag_Y ; ひゃ resultOfKCmb66=ひゃ kCmb67:=flag_E|flag_H ; ひょ resultOfKCmb67=ひょ kCmb68:=flag_E|flag_N ; ひゅ resultOfKCmb68=ひゅ kCmb69:=flag_E|flag_U ; きゃ resultOfKCmb69=きゃ kCmb70:=flag_E|flag_J ; きょ resultOfKCmb70=きょ kCmb71:=flag_E|flag_M ; きゅ resultOfKCmb71=きゅ kCmb72:=flag_E|flag_SColon ; ひぇ resultOfKCmb72=ひぇ kCmb73:=flag_E|flag_Comma ; てゃ resultOfKCmb73=てゃ kCmb74:=flag_E|flag_Dot ; てゅ resultOfKCmb74=てゅ kCmb75:=flag_E|flag_Slash ; てょ resultOfKCmb75=てょ kCmb76:=flag_O|flag_R ; じゃ resultOfKCmb76=じゃ kCmb77:=flag_O|flag_F ; じょ resultOfKCmb77=じょ kCmb78:=flag_O|flag_V ; じゅ resultOfKCmb78=じゅ kCmb79:=flag_O|flag_T ; ぢゃ resultOfKCmb79=ぢゃ kCmb80:=flag_O|flag_G ; ぢょ resultOfKCmb80=ぢょ kCmb81:=flag_O|flag_B ; ぢゅ resultOfKCmb81=ぢゅ kCmb82:=flag_O|flag_A resultOfKCmb82=ぞれ kCmb83:=flag_O|flag_Z ; ぐぃ resultOfKCmb83=ぐぃ kCmb84:=flag_O|flag_X resultOfKCmb84=など kCmb85:=flag_O|flag_C ; ぐぉ resultOfKCmb85=ぐぉ kCmb86:=flag_O|flag_Q ; ぐゎ resultOfKCmb86=ぐゎ kCmb87:=flag_O|flag_W ; ぎぇ resultOfKCmb87=ぎぇ kCmb88:=flag_O|flag_E ; ずぃ resultOfKCmb88=ずぃ kCmb89:=flag_W|flag_Y ; びゃ resultOfKCmb89=びゃ kCmb90:=flag_W|flag_H ; びょ resultOfKCmb90=びょ kCmb91:=flag_W|flag_N ; びゅ resultOfKCmb91=びゅ kCmb92:=flag_W|flag_U ; ぎゃ resultOfKCmb92=ぎゃ kCmb93:=flag_W|flag_J ; ぎょ resultOfKCmb93=ぎょ kCmb94:=flag_W|flag_M ; ぎゅ resultOfKCmb94=ぎゅ kCmb95:=flag_W|flag_SColon resultOfKCmb95=にし kCmb96:=flag_W|flag_Comma ; でゃ resultOfKCmb96=でゃ kCmb97:=flag_W|flag_Dot ; でゅ resultOfKCmb97=でゅ kCmb98:=flag_W|flag_Slash ; でょ resultOfKCmb98=でょ kCmb99:=flag_SColon|flag_R ; りゃ resultOfKCmb99=りゃ kCmb100:=flag_SColon|flag_F ; りょ resultOfKCmb100=りょ kCmb101:=flag_SColon|flag_V ; りゅ resultOfKCmb101=りゅ kCmb102:=flag_SColon|flag_T ; みゃ resultOfKCmb102=みゃ kCmb103:=flag_SColon|flag_G ; みょ resultOfKCmb103=みょ kCmb104:=flag_SColon|flag_B ; みゅ resultOfKCmb104=みゅ kCmb105:=flag_SColon|flag_A resultOfKCmb105=あり kCmb106:=flag_SColon|flag_Z resultOfKCmb106=っく kCmb107:=flag_SColon|flag_X ; つぇ resultOfKCmb107=つぇ kCmb108:=flag_SColon|flag_C ; つぉ resultOfKCmb108=つぉ kCmb109:=flag_SColon|flag_Q resultOfKCmb109=とな kCmb110:=flag_A|flag_Y ; ぴゃ resultOfKCmb110=ぴゃ kCmb111:=flag_A|flag_H ; ぴょ resultOfKCmb111=ぴょ kCmb112:=flag_A|flag_N ; ぴゅ resultOfKCmb112=ぴゅ kCmb113:=flag_A|flag_U ; にゃ resultOfKCmb113=にゃ kCmb114:=flag_A|flag_J ; にょ resultOfKCmb114=にょ kCmb115:=flag_A|flag_M ; にゅ resultOfKCmb115=にゅ kCmb116:=flag_A|flag_Comma resultOfKCmb116=まっ kCmb117:=flag_A|flag_Dot resultOfKCmb117=あた kCmb118:=flag_A|flag_Slash resultOfKCmb118=んを kCmb119:=flag_A|flag_P resultOfKCmb119=にし kCmb120:=flag_J|flag_R ; しぇ resultOfKCmb120=しぇ kCmb121:=flag_J|flag_T ; じぇ resultOfKCmb121=じぇ kCmb122:=flag_J|flag_G ; てぃ resultOfKCmb122=てぃ kCmb123:=flag_J|flag_V ; ふぁ resultOfKCmb123=ふぁ kCmb124:=flag_J|flag_B ; ふぃ resultOfKCmb124=ふぃ kCmb125:=flag_J|flag_Z ; うぃ resultOfKCmb125=うぃ kCmb126:=flag_J|flag_X ; うぇ resultOfKCmb126=うぇ kCmb127:=flag_J|flag_C ; うぉ resultOfKCmb127=うぉ kCmb128:=flag_F|flag_Y ; ぢぇ resultOfKCmb128=ぢぇ kCmb129:=flag_F|flag_U ; ちぇ resultOfKCmb129=ちぇ kCmb130:=flag_F|flag_H ; でぃ resultOfKCmb130=でぃ kCmb131:=flag_F|flag_N ; ふぇ resultOfKCmb131=ふぇ kCmb132:=flag_F|flag_M ; ふぉ resultOfKCmb132=ふぉ kCmb133:=flag_F|flag_Comma ; とぅ resultOfKCmb133=とぅ kCmb134:=flag_F|flag_Dot ; どぅ resultOfKCmb134=どぅ kCmb135:=flag_F|flag_Slash ; ふゅ resultOfKCmb135=ふゅ ;;; 「ある。」「する。」など kCmb136:=flag_AT|flag_A resultOfKCmb136=ある。 kCmb137:=flag_AT|flag_S resultOfKCmb137=する。 kCmb138:=flag_AT|flag_D resultOfKCmb138=なる。 kCmb139:=flag_AT|flag_F resultOfKCmb139=です。 kCmb140:=flag_AT|flag_G resultOfKCmb140=ます。 ;;; 記号 kCmb141:=flag_W|flag_E ; () resultOfKCmb141=(){Left} kCmb142:=flag_E|flag_R ; ! resultOfKCmb142={!} kCmb143:=flag_E|flag_F resultOfKCmb143=`: kCmb144:=flag_R|flag_G ; ~ resultOfKCmb144=~ kCmb145:=flag_S|flag_D ; [] resultOfKCmb145=[]{Left} kCmb146:=flag_D|flag_F resultOfKCmb146=. kCmb147:=flag_F|flag_G ; = resultOfKCmb147== kCmb148:=flag_D|flag_V ; <> resultOfKCmb148=<>{Left} kCmb149:=flag_X|flag_C ; {} resultOfKCmb149={{}{}}{Left} kCmb150:=flag_C|flag_V resultOfKCmb150=" kCmb151:=flag_U|flag_I ; ? resultOfKCmb151=? kCmb152:=flag_I|flag_O ; + resultOfKCmb152={+} kCmb153:=flag_U|flag_H ; * resultOfKCmb153=* kCmb154:=flag_I|flag_J resultOfKCmb154=; kCmb155:=flag_H|flag_J ; / resultOfKCmb155=/ kCmb156:=flag_J|flag_K resultOfKCmb156=, kCmb157:=flag_K|flag_L ; _ resultOfKCmb157=_ kCmb158:=flag_K|flag_N ; \ resultOfKCmb158=\ kCmb159:=flag_M|flag_Comma resultOfKCmb159=' kCmb160:=flag_Comma|flag_Dot ; | resultOfKCmb160=| ;;; 以下は追加分 kCmb161:=flag_L|flag_Q resultOfKCmb161=げ kCmb162:=flag_S|flag_Y resultOfKCmb162=び ;;; 「ない。」「ならない。」など kCmb163:=flag_AT|flag_Q resultOfKCmb163=ない。 kCmb164:=flag_AT|flag_W resultOfKCmb164=しない。 kCmb165:=flag_AT|flag_E resultOfKCmb165=ならない。 kCmb166:=flag_AT|flag_R resultOfKCmb166= kCmb167:=flag_AT|flag_T resultOfKCmb167=ません。 kCmb168:=flag_AT|flag_Z resultOfKCmb168=あった。 kCmb169:=flag_AT|flag_X resultOfKCmb169=した。 kCmb170:=flag_AT|flag_C resultOfKCmb170=なった。 kCmb171:=flag_AT|flag_V resultOfKCmb171=でした。 kCmb172:=flag_AT|flag_B resultOfKCmb172=ました。 ;;; 「あります。」「なります。」など kCmb173:=flag_BackSlash|flag_Q resultOfKCmb173=ありません。 kCmb174:=flag_BackSlash|flag_W resultOfKCmb174=しません。 kCmb175:=flag_BackSlash|flag_E resultOfKCmb175=なりません。 kCmb176:=flag_BackSlash|flag_R resultOfKCmb176= kCmb177:=flag_BackSlash|flag_T resultOfKCmb177=まいりません。 kCmb178:=flag_BackSlash|flag_A resultOfKCmb178=あります。 kCmb179:=flag_BackSlash|flag_S resultOfKCmb179=します。 kCmb180:=flag_BackSlash|flag_D resultOfKCmb180=なります。 kCmb181:=flag_BackSlash|flag_F resultOfKCmb181=ございます。 kCmb182:=flag_BackSlash|flag_G resultOfKCmb182=まいります。 kCmb183:=flag_BackSlash|flag_Z resultOfKCmb183=ありました。 kCmb184:=flag_BackSlash|flag_X resultOfKCmb184=しました。 kCmb185:=flag_BackSlash|flag_C resultOfKCmb185=なりました。 kCmb186:=flag_BackSlash|flag_V resultOfKCmb186=ございました。 kCmb187:=flag_BackSlash|flag_B resultOfKCmb187=まいりました。 kCmb188:=flag_Q|flag_W resultOfKCmb188=@ kCmb189:=flag_A|flag_S resultOfKCmb189={#} kCmb190:=flag_Z|flag_X resultOfKCmb190=$ kCmb191:=flag_O|flag_P resultOfKCmb191=`% kCmb192:=flag_L|flag_SColon resultOfKCmb192={^} kCmb193:=flag_Dot|flag_Slash resultOfKCmb193={&} kCmb194:=flag_Y|flag_U resultOfKCmb194=`` ; 同時打鍵パターンの総数 NumberOfKCmb:=194 ; キーバッファ ; bufKey には _Q のような名前(文字列)が格納されます ; bufTime はキーが押された時刻です bufKey:=0 bufTime:=0 gDownKeyName:=0 ;================================== ; IME 状態チェック GUIThreadInfo 利用版 ;================================= ; 構造体 GUITreadInfo ;typedef struct tagGUITHREADINFO { ; DWORD cbSize; ; DWORD flags; ; HWND hwndActive; ; HWND hwndFocus; ; HWND hwndCapture; ; HWND hwndMenuOwner; ; HWND hwndMoveSize; ; HWND hwndCaret; ; RECT rcCaret; ;} GUITHREADINFO, *PGUITHREADINFO; ; 48バイトを確保して初期化しておく VarSetCapacity(stGTI, 48) DllCall("RtlFillMemory", "UInt", &stGTI, "UInt", 48, "UChar", 0) DllCall("RtlFillMemory", "UInt", &stGTI, "UInt", 1, "UChar", 48) IME_IfRomaKana() { global stGTI ; フォアグラウンドスレッドの情報を取得 if( !DllCall("GetGUIThreadInfo", Uint,0, Uint, &stGTI) ) { Return 0 } ; メニュー選択中なら帰る(このチェックは今ひとつ頼りにならない?) if( *(&stGTI+4) & 0x1E ){ Return 0 } ; hwndFocus をとりだす hWnd:=*(&stGTI+15)<<24 | *(&stGTI+14)<<16 | *(&stGTI+12) | *(&stGTI+13)<<8 ; IME にメッセージを送って変換モードを教えてもらう ; IMC_GETOPENSTATUS=5, IMC_GETCONVERSIONMODE=1 hImeWnd:=DllCall("imm32\ImmGetDefaultIMEWnd", Uint,hWnd, Uint) DetectSave := A_DetectHiddenWindows DetectHiddenWindows,ON SendMessage 0x283, 0x005,"",,ahk_id %hImeWnd% if( ErrorLevel ) { SendMessage 0x283, 0x001,"",,ahk_id %hImeWnd% if( ErrorLevel==0x19) { DetectHiddenWindows,%DetectSave% Return 1 } } DetectHiddenWindows,%DetectSave% Return 0 } ;================ ; 同時打鍵の判定 ;================ ;================================= ; キーを押し込んでも即座には入力されません ; 入力を確定するタイミングは次の2つです ; ; 1. 次のキーが押されたとき (onKeyDown) ; 2. ある程度の時間が経過したとき (確定タイマー) ; ; 確定タイマーはキーが押されたときにセット/リセットされ、 ; 入力が確定したときに解除されます ; 確定タイマーはonKeyUp ルーチンを呼びます ;================================= outputChar(ByRef string){ string := RegExReplace(string, "あ", "a") string := RegExReplace(string, "い", "i") string := RegExReplace(string, "う", "u") string := RegExReplace(string, "え", "e") string := RegExReplace(string, "お", "o") string := RegExReplace(string, "か", "ka") string := RegExReplace(string, "き", "ki") string := RegExReplace(string, "く", "ku") string := RegExReplace(string, "け", "ke") string := RegExReplace(string, "こ", "ko") string := RegExReplace(string, "さ", "sa") string := RegExReplace(string, "し", "si") string := RegExReplace(string, "す", "su") string := RegExReplace(string, "せ", "se") string := RegExReplace(string, "そ", "so") string := RegExReplace(string, "た", "ta") string := RegExReplace(string, "ち", "ti") string := RegExReplace(string, "つ", "tu") string := RegExReplace(string, "て", "te") string := RegExReplace(string, "と", "to") string := RegExReplace(string, "な", "na") string := RegExReplace(string, "に", "ni") string := RegExReplace(string, "ぬ", "nu") string := RegExReplace(string, "ね", "ne") string := RegExReplace(string, "の", "no") string := RegExReplace(string, "は", "ha") string := RegExReplace(string, "ひ", "hi") string := RegExReplace(string, "ふ", "hu") string := RegExReplace(string, "へ", "he") string := RegExReplace(string, "ほ", "ho") string := RegExReplace(string, "ま", "ma") string := RegExReplace(string, "み", "mi") string := RegExReplace(string, "む", "mu") string := RegExReplace(string, "め", "me") string := RegExReplace(string, "も", "mo") string := RegExReplace(string, "や", "ya") string := RegExReplace(string, "ゆ", "yu") string := RegExReplace(string, "よ", "yo") string := RegExReplace(string, "ら", "ra") string := RegExReplace(string, "り", "ri") string := RegExReplace(string, "る", "ru") string := RegExReplace(string, "れ", "re") string := RegExReplace(string, "ろ", "ro") string := RegExReplace(string, "わ", "wa") string := RegExReplace(string, "を", "wo") string := RegExReplace(string, "ん", "nn") string := RegExReplace(string, "が", "ga") string := RegExReplace(string, "ぎ", "gi") string := RegExReplace(string, "ぐ", "gu") string := RegExReplace(string, "げ", "ge") string := RegExReplace(string, "ご", "go") string := RegExReplace(string, "ざ", "za") string := RegExReplace(string, "じ", "zi") string := RegExReplace(string, "ず", "zu") string := RegExReplace(string, "ぜ", "ze") string := RegExReplace(string, "ぞ", "zo") string := RegExReplace(string, "だ", "da") string := RegExReplace(string, "ぢ", "di") string := RegExReplace(string, "づ", "du") string := RegExReplace(string, "で", "de") string := RegExReplace(string, "ど", "do") string := RegExReplace(string, "ば", "ba") string := RegExReplace(string, "び", "bi") string := RegExReplace(string, "ぶ", "bu") string := RegExReplace(string, "べ", "be") string := RegExReplace(string, "ぼ", "bo") string := RegExReplace(string, "ぱ", "pa") string := RegExReplace(string, "ぴ", "pi") string := RegExReplace(string, "ぷ", "pu") string := RegExReplace(string, "ぺ", "pe") string := RegExReplace(string, "ぽ", "po") string := RegExReplace(string, "ヴ", "vu") string := RegExReplace(string, "ぁ", "la") string := RegExReplace(string, "ぃ", "li") string := RegExReplace(string, "ぅ", "lu") string := RegExReplace(string, "ぇ", "le") string := RegExReplace(string, "ぉ", "lo") string := RegExReplace(string, "ゃ", "lya") string := RegExReplace(string, "ゅ", "lyu") string := RegExReplace(string, "ょ", "lyo") string := RegExReplace(string, "ゎ", "lwa") string := RegExReplace(string, "っ", "ltu") string := RegExReplace(string, "。", ".") send, %string% } onKeyUp: if(bufKey) { outputChar(singleStroke%bufKey%) bufKey:=0 } setTimer, onKeyUp, Off Return onKeyDown(keyName){ global gDownKeyName if( IME_IfRomaKana() ) { gDownKeyName:=keyName GoSub onOnKeyDown return } send,% defaultKey%keyName% } onOnKeyDown: inputTime:=A_TickCount if(bufKey){ ; GapTime が許容値内であるか if( inputTime-bufTime <= MaximalGT ) { currentKeyPattern:=flag%gDownKeyName%|flag%bufKey% Loop, %NumberOfKCmb% { ; 押下中の組み合わせが定義されているか if( KCmb%A_Index% == currentKeyPattern) { ; 同時打鍵を出力、バッファとタイマーをクリア outputChar( resultOfKCmb%A_Index%) bufKey:=0 setTimer, onKeyUp, Off Return } } } ; 同時打鍵でなかったらバッファを確定 outputChar( singleStroke%bufKey%) } ; バッファ更新、タイマー設定 bufTime:=inputTime bufKey:=gDownKeyName setTimer, onKeyUp, %SingleKeyWait% gDownKeyName:=0 Return ; 以下ホットキー定義 #UseHook On ^Esc::Suspend,Toggle q::onKeyDown("_Q") w::onKeyDown("_W") e::onKeyDown("_E") r::onKeyDown("_R") t::onKeyDown("_T") y::onKeyDown("_Y") u::onKeyDown("_U") i::onKeyDown("_I") o::onKeyDown("_O") p::onKeyDown("_P") @::onKeyDown("_AT") a::onKeyDown("_A") s::onKeyDown("_S") d::onKeyDown("_D") f::onKeyDown("_F") g::onKeyDown("_G") h::onKeyDown("_H") j::onKeyDown("_J") k::onKeyDown("_K") l::onKeyDown("_L") z::onKeyDown("_Z") x::onKeyDown("_X") `;::onKeyDown("_SColon") c::onKeyDown("_C") v::onKeyDown("_V") b::onKeyDown("_B") n::onKeyDown("_N") m::onKeyDown("_M") .::onKeyDown("_Dot") /::onKeyDown("_Slash") sc033 ::onKeyDown("_Comma") sc073 ::onKeyDown("_BackSlash") #UseHook Off