use Win32::Registry; $isansi = 0; # 1 if ansi keyboard $exportreg = 0; # 1 if output reg file, 0 if modify registry for $arg (@ARGV) { $isansi = 1 if $arg eq 'ansi'; $exportreg = 1 if $arg eq 'out'; } if ($isansi) { shift @ARGV; $hanaroma = 'q=て|w=た|e=が|r=こ|t=だ|y=れ|u=っ|i=し|o=ん|p=く|' . 'a=と|s=な|f=か|g=は|h=き|j=の|l=う|;=い|' . 'z=ま|x=で|c=る|v=も|b=ょ|n=に|m=す|' . 'dq=づ|dw=ぴ|de=ぢ|dr=ぽ|dt=ヴ|dy=ぷ|du=げ|di=ぶ|do=つ|dp=ゃ|d[=「|' . 'da=ば|ds=ゅ|df=せ|dg=へ|dh=ひ|dj=め|dk=じ|dl=ち|d;=を|d\'=」|' . 'dz=ぺ|dx=ぞ|dv=ぱ|db=ぁ|dn=ぐ|dm=ふ|d,=ぎ|d.=む|d/=ぬ|' . 'kq=そ|kw=ね|ke=ぼ|kr=ほ|kt=ざ|ky=ぅ|ku=ぇ|ki=べ|ko=わ|kp=え|' . 'ka=ど|ks=ろ|kd=ら|kf=け|kg=さ|kh=び|kj=お|kl=り|k;=あ|' . 'kz=や|kx=ゆ|kc=ご|kv=ぜ|kb=よ|kn=み|km=ー|k,=ぉ|k.=ぃ|k/=ず|' . ''; } else { # こたとるだれっしんく|げぷづへ ぱぶゃつー|そねぼけほぢぇぉびべ # かな にてきの うい|ゅざ ばぜひめじちを|えあらもせぬお わず # はでまがょりす、。・|ぐぽぅゆぞふみごむぎ|さどろやよぴぺヴぃぁ $hanaroma = 'q=て|w=た|e=が|r=こ|t=だ|y=れ|u=っ|i=し|o=ん|p=く|' . 'a=と|s=な|f=か|g=は|h=き|j=の|l=う|;=い|' . 'z=ま|x=で|c=る|v=も|b=ょ|n=に|m=す|' . 'dq=づ|dw=ぴ|de=ぢ|dr=ぽ|dt=ヴ|dy=ぷ|du=げ|di=ぶ|do=つ|dp=ゃ|d@=「|' . 'da=ば|ds=ゅ|df=せ|dg=へ|dh=ひ|dj=め|dk=じ|dl=ち|d;=を|d:=」|' . 'dz=ぺ|dx=ぞ|dv=ぱ|db=ぁ|dn=ぐ|dm=ふ|d,=ぎ|d.=む|d/=ぬ|' . 'kq=そ|kw=ね|ke=ぼ|kr=ほ|kt=ざ|ky=ぅ|ku=ぇ|ki=べ|ko=わ|kp=え|' . 'ka=ど|ks=ろ|kd=ら|kf=け|kg=さ|kh=び|kj=お|kl=り|k;=あ|' . 'kz=や|kx=ゆ|kc=ご|kv=ぜ|kb=よ|kn=み|km=ー|k,=ぉ|k.=ぃ|k/=ず|' . ''; } $mskey = "Software\\Microsoft"; @imekeys = qw(IMEJP Windows\CurrentVersion\Ime\Japan Ime); for $imekey (@imekeys) { if ($HKEY_CURRENT_USER->Open("$mskey\\$imekey", $imereg)) { undef @keys; $imereg->GetKeys(\@keys); for $key (@keys) { if ($imereg->Open("$key\\RomaDef", $imereg2)) { &addhana($imekey, "$mskey\\$imekey\\$key\\RomaDef", $imereg2); $imereg2->Close(); $ok = 1; } } } } $ok || die "can't find MS-IME in registry.\n"; sub addhana ($$) { my ($imekey, $keyname, $imereg) = @_; my ($imereg1, $hanaroma_buf); if ($imekey eq 'IMEJP') { # Windows XP, 2003, Vista, 2007 $hanaroma_buf = join("\0", sort(split('\\|', $hanaroma))) . "\0\0"; if ($exportreg) { &printregbinary("$keyname\\tsuki5-315kai", "table", $hanaroma_buf); } else { $imereg->Create('tsuki5-315kai', $imereg1); $imereg1->SetValueEx('table', 0, REG_BINARY, $hanaroma_buf) || die "can't set roma-kana definition to registry: $!\n"; $imereg1->Close(); } } else { if ($imekey eq 'Ime') { # IME 97 $hanaroma_buf = join("\0\0", sort(split('\\|', $hanaroma))) . "\0\0"; } else { # IME 98, 2000 $hanaroma_buf = join("\0", sort(split('\\|', $hanaroma))) . "\0\0"; } if ($exportreg) { &printregbinary("$keyname", "tsuki5-315kai", $hanaroma_buf); } else { $imereg->SetValueEx('tsuki5-315kai', 0, REG_BINARY, $hanaroma_buf) || die "can't set roma-kana definition to registry: $!\n"; } } if (!$exportreg) { print STDERR "added Hana to $keyname\n"; } } sub printregbinary { my ($key, $name, $value) = @_; if (!$headerout) { $headerout = 1; print "REGEDIT4\n\n"; # Win95 format } print "[HKEY_CURRENT_USER\\$key]\n"; print "\"$name\"=hex:"; my $col = 5; my $first = 1; for $c (unpack('C*', $value)) { if ($col >= 25) { print ",\\\n "; $col = 1; } else { if ($first) { $first = 0; } else { print ','; } $col++; } printf '%02x', $c; } print "\n\n"; }