PDA の優秀なところはサスペンドからの復帰がほぼ瞬時であることです。 起動の速さは使うことへの ためらい を無くしてくれます。
起動の速さに加えてタッチタイプできるキーボードに惚れ込んで、 最初に買った WindowsCE 機が NEC MobileGearII R/530 でした。 それ以後ほぼ毎日、 キーボードつきハンドヘルド PC はメモや議事録用などに高い頻度で活躍しています。 今は二代目ハンドヘルド PC として HP Jornada720 を 買い換える機種もないまま使い続けています。
ノートPCとの違いは起動の速さとラフに扱えること。 もちろん PC の方が良い面も多いし、 何年も前の機種なので機能的にも見劣りするし、 その割りにでかくて重かったりと不満もないわけではありません。 それでも使い続けている理由は 「 入力専用 」 と完全に割り切ったことでしょうか。
結局データの閲覧やら通信用にはすぐ取り出せる小さい方がいいので、 小型の PDA PocketPC を併用しています。 荷物も増えるしデータ管理やシンクロも面倒になるので本当はひとつに したいところなのですが。
PocketPC + 外付けキーボードという組み合わせも何度か試しました。 ですが キーボードを接続する手間やキーボードのキー配列に不満があったり、 また持ち歩くときの大きさと重さなどをよくよく考えると、 ハンドヘルドPC を一緒に持ち歩くのとさほどかわりませんでした。
キーボード自体は Jornada720 クラスでいいんですが、 なかなか自分にとって理想的なものはないようです。 永遠に見つからないのかもしれません。きっと作るしかないんでしょう。
ふと、Jornada720 自体を外付けキーボードにしてみようと思いました。
そのために通信手段が必要ですが、 まずは PocketPC 側に汎用のキーコード受付口を作ってみます。
PocketPC 2002 SDK を install するとこのあたりにサンプルがあります。
C:\Program Files\Windows CE Tools\wce300\Pocket PC 2002\samples\atl\dvoraksip
もしくは
C:\Windows CE Tools\wce300\Pocket PC 2002\samples\atl\dvoraksip
このソースをベースにすれば SIP 自体は簡単に作れるようです。 PocketPC 2003 SDK でもほぼ同じ場所にサンプルがあるようです。 とりあえず 2002 で実験してみることにします。
原理としては DLL の COM サービスとして SIP 関連の API を実装し、 外部から参照できるようレジストリに登録します。 HKEY_CLASSES_ROOT\CLSID に SIP を識別できる独自の uuid でキーをつくり InprocServer32 に dll を登録します。 その後 IsSIPInputMethod に "1" を設定します。 このレジストリがきちんと登録されていれば その dll は SIP とみなされ選択可能になります。 サンプルやレジストリ自身を参照するとより詳しいことがわかります。
SIP の dll はインターフェースとして IInputMethod を実装する必要があり、 IIMCallback を使ってキー入力をシステムに渡します。 これらのインターフェースは SDK の include\sip.h に定義されています。 ヘッダをよく見ると IIMCallback2 や IInputMethod2 などの拡張インターフェース も存在しているようです。 IInputMethod の QueryInterface() でお呼びがかかっているので、 IInputMethod2 も実装した方がいいのかもしれません。
サンプルの場合は dvorak_implementation.cpp が実際のキーボード処理で、 ここに自分のキーボード実装を乗せていく形になるでしょう。 それ以外のコードは自分自身の uuid や名前など、最小限の変更で済むようです。
組み込んだ SIP を外すには一度ソフトリセットします。 起動直後でまだ SIP の DLL がメモリに読み込まれてない状態であれば、 dlL ファイルの削除ができます。対象レジストリも消しておきましょう。
ただしサンプルでは英語の dovorak 配列キーボードのみで、 日本語関連の制御が出来ません。 このあたりは手探りで探してみました。
SIP に VK_KANJI 等の日本語用キーコードを割り当てても うまく切り替わりません。 が、いろいろ組み合わせを探っていたら単純に ALT + KANJI である「VK_LMENU + VK_KANJI」で ON/OFF 出来ることがわかりました。
VK_NOCONVERT が 無変換 キーに相当します。 IME ON 時に「SHIFT + 無変換」で 全角英数、半角英数 の切り替え、 ただの 無変換 でそのままひらがなに戻るようです。 多分これらは IME の機能でしょう。
仮想キーコードは winuser.h に定義されています。
MS の WindowsMobile デベロッパというこちらのページにはいろいろな
プログラミングの情報があります。
http://www.microsoft.com/japan/windowsmobile/developer/technicalarticles/default.asp
この中の「PocketPC プログラミングガイド (PocketPC 2002)」
http://www.microsoft.com/japan/windowsmobile/pocketpc/techpapers/techguide/default.asp
を見ると、デバイス自体の電源 OFF 方法 (サスペンド方法)
として次の例が載ってます。
keybd_event( VK_OFF, 0, KEYEVENTF_SILENT, 0 ); // DOWN keybd_event( VK_OFF, 0, KEYEVENTF_KEYUP|KEYEVENTF_SILENT, 0 ); // YUP
なんとも単純に電源 OFF ボタンのキーコードをシステムに送りつけているだけです。
これを参考にすると IIMCallback を使わなくても先ほどの ALT + KANJI は
keybd_event( VK_LMENU, 0, KEYEVENTF_SILENT, 0 ); keybd_event( VK_KANJI, 0, KEYEVENTF_SILENT, 0 ); keybd_event( VK_KANJI, 0, KEYEVENTF_KEYUP|KEYEVENTF_SILENT, 0 ); keybd_event( VK_LMENU, 0, KEYEVENTF_KEYUP|KEYEVENTF_SILENT, 0 );
で実装できることがわかりました。 ここまで来て、 外付けキーボード用ドライバは仮想キーコードだけ扱うなら SIP として実装する必然性がないことに気が付きました。
また IME の本来の制御用に Imm〜 という API があります。
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/intl/ime_1n3n.asp?frame=true
一番目の引数はウィンドウのコンテキストなので、 SIP の中からどうやって参照するのかわからず最初手をつけずにいました。 ところが NULL を入れて試したらあっさり PocketPC 2002 で制御できました。 簡単です。
例えば IME on と off を指定するには次のようにします。
ImmSetOpenStatus( NULL, TRUE ); // IME on
ImmSetOpenStatus( NULL, FALSE ); // IME off
試していませんが、細かいモード切替などもおそらく これで出来るのではないでしょうか。
仮想キーコードだけ扱うため、SIP ではなく通常アプリケーションとして のせてみました。LAN で PC とつないでます。
PocketPC 側は単純に適当なポートを開いてキーコードを受け取り、 そのまま keybd_event() を呼び出すアプリケーションを組みます。
HOST PC 側はアプリは、入力されたキーの仮想キーコードを PocketPC の指定ポートに送りつけるだけです。 DOWN UP 両方必要です。
ローカルの IME が起動したりと一部キーを送信できないのですが、 とりあえずあっさり動作しました。 実験は iPAQ h3630 (PocketPC 2002) +無線 LAN と WindowsXP で行っています。
そのままメモなどのアプリケーションを起動してキー入力できます。 ただし US キーボード配列になってしまいます。 キー配列の細かい変更やカスタマイズを行う場合は、 やはり SIP として作った方がいいのかもしれません。
念のため、現状実用性はありません。 リモートでキーを打てるのは面白いのですが、 PC は外付けキーボードには大きすぎます。
[メニューに戻る] | [ZAURUS総合] | [Direct3D] | [Ko-Window] | [Win32] | [WinCE] | [携帯電話] | [その他] |
フルパワー全開 | Hyperでんち |