2010年6月アーカイブ

タブキーで確定同時タブ入力

| コメント(0) | トラックバック(0)
DFJ2を真似したキー設定で使い続けること14年、流れ流れてATOK。

DFJ2/WINがどうだったかは記憶の彼方ですが、VJE-Deltaでは確定前にタブキーを押すと、確定と同時にタブが入力されました。2.0/2.5/4.0共通の仕様だったはずです。

どうなるかというと、Webブラウザのフォームで日本語入力している時に便利なのです。例えば姓を変換してタブを押すと、姓を確定しつつ名の欄に移動する具合になります。

しかしATOK2008では、どう設定してもこれは実現できないようでした。

この場合、とりあえずタブに全文確定を割り当て、確定を検出してVK_TABを発行すれば良いわけです。

Spy++を眺めたところ、確定すると下記のようなメッセージが来ていました。

WM_IME_NOTIFY / IMN_PRIVATE / lParam:0x04
WM_IME_NOTIFY / IMN_PRIVATE / lParam:0x13
WM_IME_ENDCOMPOSITION

IMN_PRIVATEは必ず0x04~0x13の順ですが、変換してから確定するとWM_IME_ENDCOMPOSITIONが二つのIMN_PRIVATEより後(上記のままの順序)、変換前に確定するとWM_IME_ENDCOMPOSITIONが先になります。

Vista/7上のATOK2008とFirefoxの組み合わせではWM_IME_ENDCOMPOSITIONが来ず、また二度目以降の確定の場合は0x13のIMN_PRIVATEも来ませんでした。ということで、0x04のIMN_PRIVATEを処理すれば良いことになります。
XP上でVJE-Delta4.0とFirefoxの組み合わせだとWM_IME_ENDCOMPOSITIONは普通に来るのですが。

DeltaEndにこの仕組みを入れたテスト版で動作を確認できましたが、現在のメイン環境は64ビットです。64ビットEXEとDLLも用意しないと、64ビットアプリにフックが届きませんし、その場合はそれぞれDLLを別名にしなければならないということでした。

# Webブラウザぐらいでしか使わない機能だと割り切る選択肢もあり

32ビットをメインとし、64ビット動作用の子プロセスを呼ぶとして、設定の同期が課題です。まずは32ビットEXE~32ビットDLL間を共有メモリにしてみましょうか。

キーボードフィルタ

| コメント(0) | トラックバック(0)
キーボードフィルタドライバの使い方がわかってきました。いくらでも試して操作不能にできる仮想PC環境のおかげです。

例えば無変換キーを
  • KEYDOWNでKEYUPも発行
  • KEYUPは無視
  • リピート却下
とする場合、後述のようなコードになっています。

ベースのkbfiltrはWDK 6001.18002です。スキャンコード一覧はこちらにあります。その他、ここここここを参考にしまし た。

レイアウトドライバで無変換にVK_KANAを割り当てれば、遜色ないカナキーにすることができるわけです。

ローレベルの制御をドライバで完了できれば、管理者権限のユーティリティが不要になります。一般権限では管理者権限アプリをフックできませんが、カナインジケータ程度の監視ならポーリングのような、より普通の実装にすべきなのでしょう。

VOID
KbFilter_ServiceCallback(
  IN PDEVICE_OBJECT DeviceObject,
  IN PKEYBOARD_INPUT_DATA InputDataStart,
  IN PKEYBOARD_INPUT_DATA InputDataEnd,
  IN OUT PULONG InputDataConsumed
  )
{
  PDEVICE_EXTENSION  devExt;
  KEYBOARD_INPUT_DATA kana[1] = {0};
  PKEYBOARD_INPUT_DATA curInputData = InputDataStart;
  ULONG tempConsumed = 0;
  static int bInKana = 0;

  devExt = (PDEVICE_EXTENSION) DeviceObject->DeviceExtension;

  while( curInputData < InputDataEnd )
  {
    switch ( curInputData->MakeCode )
    {
    case 0x7b:
      if ( ( InputDataStart->Flags & KEY_BREAK ) == 0 ) {
        if ( bInKana == 0 ) {
          bInKana = 1;

          kana[0].MakeCode = 0x7b;
          kana[0].Flags = KEY_MAKE;
          tempConsumed = 0;

          (*(PSERVICE_CALLBACK_ROUTINE) devExt->UpperConnectData.ClassService)(
            devExt->UpperConnectData.ClassDeviceObject,
            &kana[0],
            &kana[1],
            &tempConsumed);

          kana[0].Flags = KEY_BREAK;
          tempConsumed = 0;

          (*(PSERVICE_CALLBACK_ROUTINE) devExt->UpperConnectData.ClassService)(
            devExt->UpperConnectData.ClassDeviceObject,
            &kana[0],
            &kana[1],
            &tempConsumed );
        }
        else {
          curInputData++;
          continue;
        }
      }
      else {
        bInKana = 0;

        curInputData++;
        continue;
      }
      break;
    
    default:
      tempConsumed = 0;
      (*(PSERVICE_CALLBACK_ROUTINE) devExt->UpperConnectData.ClassService)(
        devExt->UpperConnectData.ClassDeviceObject,
        curInputData,
        curInputData + 1,
        &tempConsumed );
    }
    curInputData++;
  }

  *InputDataConsumed = ( InputDataEnd - InputDataStart );
}

iPhone 4

| コメント(0) | トラックバック(0)
iPhone 4が発表されました。6月24日発売だそうです。

個人的に最大の関心事だったFMチューナーは搭載されていませんでした。これはチューナー内蔵ヘッドフォンと組み合わせるのが良いのでしょう。

そうなると敢えて3GSを購入するという選択肢も出てきますが、機能に無頓着な私がiPhone 4を選ぶ理由があるとしたら、下記のような点です。

  • iOS 4で従来機種のスペック不足が予想される
  • ノイズキャンセル機能が付いた
  • アンテナの一部が外枠と一体化して感度が向上
  • 割れているのを見たことがあるので強化ガラスは丈夫そう

ソフトバンクの電波は勤め先のあたりで少し弱いので、外枠アンテナは実は必須かもしれません。また同僚のiPhoneが割れているので、強化ガラスも地味に効果があるかもしれません。

何はともあれ820Pのスーパーボーナスが終わる来月ということで。

デバッグシンボル

| コメント(0) | トラックバック(0)
何となく、ドライバ類からデバッグ用シンボル情報を削除する話をまとめます。

まず、rebaseする方法。Windows 2000 DDKぐらいまではこれ。Free Buildでも入るのでこうしたKBがあります。
[NT DDK] デバイス ドライバからシンボルを削除する方法

Server 2003 SP1 DDKはmakefile.newの修正が必要です。
LINKER_FLAGSにLINKER_DBG_SECTIONを追加している部分をFree Buildの場合に除外します。

LINKER_FLAGS = $(LINKER_FLAGS) $(LINKER_DBG_SECTION) -debugtype:cv $(LINK_OS_VERSIONS)
これを
!if $(FREEBUILD)
LINKER_FLAGS = $(LINKER_FLAGS) $(LINK_OS_VERSIONS)
!else
LINKER_FLAGS = $(LINKER_FLAGS) $(LINKER_DBG_SECTION) -debugtype:cv $(LINK_OS_VERSIONS)
!endif
こう。

WDKもmakefile.new修正ですが少し変わりました。6001.18002と7600.16385.1で共通です。

LINKER_FLAGS = $(LINKER_FLAGS) $(LINKER_DBG_SECTION) $(LINK_OS_VERSIONS)
これを
!if $(FREEBUILD)
LINKER_FLAGS = $(LINKER_FLAGS) $(LINK_OS_VERSIONS)
!else
LINKER_FLAGS = $(LINKER_FLAGS) $(LINKER_DBG_SECTION) $(LINK_OS_VERSIONS)
!endif
こんな感じに。

ただし2003 DDK以降は派手には残らず、pdbファイルへのフルパスが残る程度のものとなっています。ちょうどVisual C++でデフォルト設定のままReleaseビルドした状態に相当ですので、気にしない人には問題ありません。
1

アーカイブ

ウェブページ

Powered by Movable Type 5.2.13

ホームページ