そろそろ 0.12.0 が…

これ書いてる時点で 0.12.0-rc1 はリリースされてるし、ちょっと前に rc2 分の Changelog も入ったのできっと今年じゅうには 0.12.0 正式版とか出るんだろうなー、とは思う。

しかし 0.12.0 はソースツリーから kqemu 関連のコードが(すでに予告されていたように)ごっそり削除されているので Win32 プロパーな観点からするとますます微妙な感じであります。

俺と Win32 コンソール(3):とりあえず IME のオン/オフとかやってみる

まあ Alt+漢字のキーストロークを keybd_event で叩き込むだけでいけるんですが。

void ToggleIMEStateByKeyStroke(void)
{
   /* キー注入結果を反映させるための待ち(手元の環境では単なる Yield 扱いの 
      0 でも問題なさそうだった。環境によってはもっと大きめの値がいるかも) */
  const DWORD dwYieldMSecForKey = 1;
  
  keybd_event(VK_MENU, 0 /* 0x38 */, 0, 0);                 /* down Alt */
  keybd_event(VK_KANJI, 0 /* 0x29 */, 0, 0);                /* down Kanji */
  keybd_event(VK_MENU, 0 /* 0x38 */, KEYEVENTF_KEYUP, 0);   /* up Alt */
  keybd_event(VK_KANJI, 0 /* 0x29 */, KEYEVENTF_KEYUP, 0);  /* up Kanji */
  Sleep(dwYieldMSecForKey);  /* wait for a proof */
}

ただ、コンソールウィンドウ自身がキー入力のフォーカスを持っていないと、よそのウィンドウの IME が開いたり閉じたりしちゃう罠。とりあえず GetConsoleWindow() == GetForegroundWindow() の確認が必要です。

あともうひとつの問題は、コンソールウィンドウの場合、現在の IME のモードを確実に判定する方法がどうも存在しないっぽいことです。IME 系の API で問い合わせてもダメだしなあ(実は Win9x なら取れるのだが)…

いろいろ悪あがきしてみたけど「確実」にはほど遠い。一応それらしいソースも晒してみます。

続きを読む