雑記帳

電子計算機の"明後日"から、他愛もない話まで。

Windows8.1で「親指の友」が動かない件(原因と対策)

2018/06/18追記
本記事記載内容に一部誤りがありました。詳細はこちらを参照下さい。

 

拙作「親指の友」ドライバですが、今のところ、Windows8.1ではマトモに動作しないことを確認しています(おそらくWin8でも同じことだと思います)。

色々あの手この手で調べてみた結果、原因は「キーボードドライバにIMEの状態が通知されなくなった」ことにあるようです。

それまでのWindows NT系のOS(Windows 7まで)では、ユーザモードでIMEの状態が変化する度に「IOCTL_KEYBOARD_QUERY_IME_STATUS」というI/Oコントロールがキーボードドライバへ自動的に送られていました。これを使うと、ドライバでもIME等の状態を得ることができるので、それに合わせて、同時打鍵検出をするかしないかといった判断を行うことができます。

ところがWindows 8.1だと、どう見てもこれが来ていない…。そのため、キーボードドライバ側の内部入力モードが初期値(英小)固定となり、親指シフトができない事態となります。他にカーネルモードドライバ単独でIMEの状態を知る手段は無いはずですので、富士通ドライバがWindows 8未対応になっているのも理解できます…。はっきり言って根幹部分なので致命的です…。

ったく、こんな重要なコード、何で削ったんだよー。未だに"#ifndef NEC98"とか残してるくせに(WDKサンプル参照)、そっちリファクタしてろや >M$(2014/03/01追記: 2003DDK付属サンプルの時点で既にNEC98やALPHAといった部分は消滅していたようです…。)

 

仕方ないので回避策を考えますが…

  1. ユーザモードでIMEの状態監視ソフトを走らせ、変化を検出したら前述のI/Oコントロールをキーボードドライバへ投げる

    つまり、親指シフトエミュレータIME監視部分のようなソフトを作り、それまでOS内部でやっていたことを肩代わりしてやる…という動きです。

    うまくいけば、富士通ドライバやサニコンドライバ等も動かせるようになると思われます。

    問題は、IMM32を使わない方々のフック…。

  2. 「親指の友」は諦め、拙作「丸投げドライバ」とユーザモードのエミュレータを併用する

    民間でできることは民間でやる、小さな政府を目指しま…ではなくて、なるべくユーザモードで何でもやったれ…という動きです。

  3. Windows8準拠のIMEを作って、その中から自分の状態に合わせてI/Oコントロールを投げる

    そこまでやってられるか

但し、前二つはストアアプリ対応不可です(グローバルフックが効かないらしいので)。1だと、ストアアプリ中はモードが切り替わらなくなり、2では親指シフト自体ができなくなると思われます。最後のものが一番有用そうですが、IMEの変換ロジックまで自前になるので、さすがに手に負えません。それこそ富士通ミドルがJapanist V4として作ってくれればいいんじゃないですかね。

というわけで、まずは1の実験をやってみます。

 

(続く)