通常のQwerty配列よりも、Dvorak配列が好き。
しかし、ctrl+Cやctrl+Vなどのショートカットは、Qwerty配列の方が便利。
通常時はDvorak配列にし、
ctrlキーを押した時はQwerty配列にしたい。
AutoHotKeyでスクリプトコードを作った。
SendMode Input
SetWorkingDir %A_ScriptDir%
IME_GET(WinTitle="A") {
ControlGet,hwnd,HWND,,,%WinTitle%
if (WinActive(WinTitle)) {
ptrSize := !A_PtrSize ? 4 : A_PtrSize
VarSetCapacity(stGTI, cbSize:=4+4+(PtrSize*6)+16, 0)
NumPut(cbSize, stGTI, 0, "UInt") ; DWORD cbSize;
hwnd := DllCall("GetGUIThreadInfo", Uint,0, Uint,&stGTI)
? NumGet(stGTI,8+PtrSize,"UInt") : hwnd
}
return DllCall("SendMessage"
, UInt, DllCall("imm32\ImmGetDefaultIMEWnd", Uint,hwnd)
, UInt, 0x0283 ;Message : WM_IME_CONTROL
, Int, 0x0005 ;wParam : IMC_GETOPENSTATUS
, Int, 0) ;lParam : 0
}
#IF (IME_GET() == 0)
;when IME is OFF, dvorak (kigou=JIS, with ctrl=qwerty)
q::Send,'
+q::Send,"
w::Send,,
+w::Send,<
e::Send,.
+e::Send,>
r::Send,p
+r::Send,+p
t::Send,y
+t::Send,+y
y::Send,f
+y::Send,+f
u::Send,g
+u::Send,+g
i::Send,c
+i::Send,+c
o::Send,r
+o::Send,+r
p::Send,l
+p::Send,+l
@::Send,/
+@::Send,?
s::Send,o
+s::Send,+o
d::Send,e
+d::Send,+e
f::Send,u
+f::Send,+u
g::Send,i
+g::Send,+i
h::Send,d
+h::Send,+d
j::Send,h
+j::Send,+h
k::Send,t
+k::Send,+t
l::Send,n
+l::Send,+n
sc027::Send,s
+sc027::Send,+s
sc028::Send,-
+sc028::Send,_
z::Send,{SC027} ; ";"
+z::Send,{SC028} ; ":"
x::Send,q
+x::Send,+q
c::Send,j
+c::Send,+j
v::Send,k
+v::Send,+k
b::Send,x
+b::Send,+x
n::Send,b
+n::Send,+b
m::Send,m
+m::Send,+m
sc033::Send,w
+sc033::Send,+w
.::Send,v
+.::Send,+v
/::Send,z
+/::Send,+z
+sc073::Send,@
メモ:
c::Send,j
+c::Send,+j
と書かなくても、
*c::Send,{Blind}j
と書けば事足りるが、
これではctrl+cと押した時に、ctrl+jと変換されてしまうので、
コピーのショートカットが使えなくなってしまう。
なのでわざわざ二行に分けて書いてある。
(+はshiftと同時押しの意味。*はCtrl/Alt/Shift/Winと同時押しの意味。)
IF (IME_GET() == 0)
と書くことにより、IME OFF、つまり直接入力の時のみ、Dvorak配列が有効になる。
IME_GET()関数は、コチラのサイトから頂いた。
https://w.atwiki.jp/eamat/pages/17.html
ありがとうございました。
数字の段の記号は日本語キーボードの配置にしてある。
いつでも日本語キーボードに戻れるように。
それだと「@」が打てなくなってしまうので、「@」を一番右下のキーに配置した。