Menu

My Works
- LEDチェッカ
- 太陽電池式回路テスタ
- TTL Pong
- DSP プリセットラジオ
- 電動式 CVCC 電源装置
- OLED MP3 プレーヤ
- etc.

Report
- MIDI のハードウェア
- aitendo DSPラジオ一覧表
- etc.

Parts Collection
- Logic IC
- Calculator LSI
- CMOS Melody IC
- etc.

Blog

Recent Updates

主な更新のみ

24/03/10
- Logic IC Collection


USB接続 IME 状態表示デバイス

公開:2012/12/23
最終更新: 2015/01/07

 
デバイス外観。(背面は mini-USB コネクタ) / 高輝度LED により IME が ON であることを知らせる

パソコンに文字を打ち込むとき IME の ON/OFF が想定と違うと、下の写真のようになってしまい、フラストレーションが溜まります。

フラストレーションの例。

こうなる原因は Windows の IME の状態表示が見づらいという点にあると感じます。広いデスクトップ画面のどこかにあるごく小さな IME ツールバーだけが、IME の状態を伝える唯一のインタフェースです。 表示が小さいことに加えて、Windows では IME の状態はウィンドウ毎に保持されるという点も問題です。つまり思い通りに日本語を入力するためには、ウィンドウを切り替えるたびに画面上のわずかな位置を占める IME ツールバーを確認する必要があるということになります。これはかなり無理があるように思います。

IME ツールバー。

そういうわけで、今回は IME の現在の状態が嫌でも目に入るような物理的な USB デバイスを作ってみました。
このデバイスをキーボードのかたわらに置くことで、ミスタイプの頻度が激減して、フラストレーションから開放されました!

プロジェクト・ダウンロード

仕様

導入方法

  1. デバイスを実装して、ファームウェアを書き込みます。
  2. デバイスを PC に接続します。
  3. 「ホスト側ソフトウェア」を起動して、LED が操作できることを確認します。(デバイスが接続されていれば起動してすぐタスクバーに格納されるので、タスクバーのアイコンを右クリックして「設定」をクリックすることで、設定画面を呼び出します。)
  4. 「格納」ボタンをクリックして、IME 状態が LED に適切に反映されることを確認します。
  5. 「ホスト側ソフトウェア」をスタートアップに登録します。これで次回 PC 起動時から自動的にアプリケーションが開始します。

ハードウェア

USB 対応の PIC マイコン PIC18F14K50 を使います。これは秋月電子で最も安く手に入る USB マイコンです。全体の材料費は 500 円もかかりませんでした。以下の写真は製作例です。また、ケースとしては、小さな黒いプラスチックケースを使用しました。


基板外観。

表示は超高輝度 LED によって行うことで、このデバイスを目に付くところにおいておけば、IME の状態がわかりやすく認識できます。そのままでは環境によってはまぶしすぎる場合があるので、LED を点灯させたときの明るさを PC から調節できるようにしています。


(1)非点灯時             (2)明るさ最小            (3)明るさ中間             (4)明るさ最大

今回は HID デバイスとして構成しますので、Microchip のサンプルプロジェクト「Device - HID - Custom Demos」 を改変して製作しました。HID デバイスでは、デバイスとホストとの間のデータのやり取りには主にインタラプト通信とコントロール通信の2通りがあります。今回のプロジェクトではサンプルプロジェクトと同様に、デバイスへのデータ送信は インタラプト通信によって行います。

USB デバイスの開発というのはかなり敷居が高く感じますし、覚えなければいけない概念はかなり多いように感じます。しかしながら、とりあえず動けばいいという立場ならば、Microchip のサンプルコードの改変で手軽にデバイスを作ることができます。このあたりの話はトラ技 2012 年 6 月号が参考になりました。

ソフトウェア

標準のキーボードドライバでは IME 状態の表示に対応できないので、PC 側のソフトウェアも作る必要があります。ドライバを書くか、逐一 IME の状態を送信するプログラムを書くかということになると思います。一般的にドライバを書くのはかなりしんどい作業といえます。今回はコンセプトワークということで、タスクバーに常駐して 150ms 毎に IME の状態を デバイスに送信するという方針でソフトウェアを実装しました。

Windows 用ソフトウェアを用意しました。このソフトウェアをスタートアップに登録しておくことをお勧めします。

 
(左)設定画面。(右)タスクバー格納時。

(注意)
Windows 7 では、互換モードで「Windows XP SP3」を選択して起動すれば動作します。

前述の理由により、マイコン側のファームウェアで私が書いたコードはほとんどゼロに等しいなので。このプロジェクトの 90% 以上はパソコン側のソフトウェア開発にあります。

(操作説明)

起動時にデバイスが正常に認識されていれば、起動してすぐタスクバーに格納されるので、タスクバーのアイコンを右クリックして「設定」をクリックすることで、設定画面を呼び出します。

設定画面では、「デバイスのテスト」ボタンにより LED の ON/OFF が操作できます。また、LED 点灯時の輝度も設定できます。

「格納」ボタンを押すことで、アプリケーションは IME の状態の監視を開始します。同時にアプリケーションはタスクバーに格納されます。

タスクバーに格納された状態では、タスクバーのアイコンを右クリックすることで、設定メニューが呼び出せます。

ソフトウェア詳細(stub)

(ホスト⇒デバイスの通信プロトコル)

インタラプト通信によってデータを送信します。データは 64 バイト長で、最初のバイトは LED の ON(1)/OFF(0) を、次のバイトは LED の明るさ(0-255) を指定します。残りのバイトとレポート ID は 0 を指定します。

(IME状態を取得するプログラムについて)

IME 関係処理は "imm32.lib" を使用します。IME の状態は IME のウィンドウハンドルに向かって WM_IME_CONTROL メッセージを投げて取得します。このとき、wParam に定数 IMC_GETOPENSTATUS をセットすると、返り値として現在の IME の状態が得られる・・・ はずなのですが、IMC_GETOPENSTATUS の定義が "imm.h" にありません。調べてみるとこれは 5 らしいので、仕方がないので直接 wParam=5 を送信すると、無事 IME の状態が取得できました。ImmGetDefaultIMEWnd 関数によって取得できます。結局、フォアグラウンドウィンドウ の IME の状態は、以下のコードで取得できます。

HWND fwd = ::GetForegroundWindow(), imwd;
int ost = 0; // IME 状態
imwd = ImmGetDefaultIMEWnd(fwd);
if(imwd) ost = ::SendMessage(imwd, WM_IME_CONTROL, 5, NULL);

(ホスト側 USB 通信処理プログラムについて)

USB に接続された HID デバイスとの通信を行うことになります。DLL とのリンクなどいろいろ面倒なので、C++ のクラスにまとめました。とりあえずインタラプト通信とコントロール通信ができます。使い方はソースコードを見ればわかると思います。


参考図