HookKeyHookを使う

HookKeyHookは、受話キーと終話キーにアプリやキーコード発行を割り当てることができるアプリです。

HookKeyHook v0.10: W-ZERO3 Holic

個人的には、このプログラムは面白いなぁと思いながらも、受話キーと終話キーにアプリを割り当てるのはちょっと抵抗がありました。
TreoやWM6エミュレータ(ただしProfessional Edition)では、受話キーは0x72、終話キーは0x73のキーコードが発行されます。
HookKeyHook v0.08から単体でキーコード発行できるようになったので、これを機に受話キーと終話キーでキーコードを発行させてみようと思いました。

HookKeyHookに同梱されているHKHSettingで下記のように設定しました。


[通話ボタン]
File: sendkey Opt 0x72
[終話ボタン]
File: sendkey Opt 0x73


「電話中もボタンをフック」という設定もありますが、私は通話と終話の両方ともチェックしました。

これで、HookKeyHook.exeを起動すれば受話キーと終話キーがフックされてキーコードが発行されます。
もちろん、このままではソフトリセットしたら毎回HookKeyHook.exeを起動しないとならないので、ショートカットをスタートアップに入れておきます。

ただ、これだとキーコードを発行するだけで電話ができなくなってしまうのでSortInchKeyで0x72と0x73について設定します。
まず、SortInchKeySettings.exeを起動して、「メニュー」→「設定」の「キー」タブの「追加」ボタンを押します。
キー名称とキーコードを下記のように設定します。


OFFHOOK 0x72
ONHOOK  0x73


で、その後それぞれにアプリを割り当てます。

コード 同時コード 短押し 長押し
OFFHOOK アプリ実行:OffHook.exe
ONHOOK アプリ実行:OnHook.exe


OffHook.exeとOnHook.exeはHookKeyHookに同梱されているアプリで、通常の受話と終話を行うだけのアプリです。
つまり、この割り当てだけだと元の動作と同じなので割り当てた意味ないじゃんってことですが、他の割り当てを追加することでこの設定は意味を持ちます。
例えば、Operaが前面に出てる時だけ割り当てる設定とか、HYPER状態の時だけ割り当てる設定とか。
常に受話キーと終話キーに割り当てるのは抵抗あるけど、条件付きならいいかなと思って。

Status22の秘密のフラグ

ここ1週間ほど、テンキー側の文字キーをどうにかしてフックできないものかと調べていましたが、分かったことをメモしておきます。

Ad[es]レジストリ「HKEY_CURRENT_USER\Software\Sharp\PhoneStatus\Status22」の値は、通常は0〜7を示し、キーボードが開いていると16ビット目のフラグ(0x00010000)が立っています(?)。


タイトルにも書いた秘密のフラグと言うのは8ビット目(0x00000100)の事です。
このフラグを立てると、なんと!
テンキー側の文字キーがAPP2を発行するではありませんか!
ついでにクリアキーもAPP1を発行するようになります。
これで文字キーのフックも万事解決・・・かと思いきや、そうはいかないのが現実。


8ビット目を立てると、何がどうしても縦画面で日本語が打てなくなりますorz
もう少し具体的に言うと、常に「_1」が選択されたような感じになり、数字しか打てなくなってしまいます。


ここからは妄想ですが、文字キーのデフォルトはAPP2で、テンキー自体も0x30(0ボタン)とか0x31(1ボタン)がデフォルトで、どこかで動いているプログラムがStatus22の値によってキーコードを発行しなおしてるか、もしくはそいつ自身がStatus22の値によってキーコードを発行させてるんじゃないかと思ってしまいます。
(OSの中身とかぜんぜん知らない人なので適当な事言ってるかも・・・)


なぜそう思ったかというと、Status22の値が0〜6の時と、値が7もしくは8ビット目が立っている時とでキーコードが発行されるタイミングが少し違うからです。

一番まともなタイミングで発行されるのが「_1」です。
キーを押した時にDownのコードが発行され、キーを離した時にUpのコードが発行されます。
他の「あ」や「_a」は、キーを押した時にDownとUpのコードが同時に出てきます。

このような違いがあったため、そのキーを発行しているプログラムを探し当てれば何とかフックできないかと思って調べていましたが、もうこれ以上分かりませんでした。
というか、そのアプリが分かったとしても私の知識の範囲ではどうすることもできないと気づいたのもあります。

以上、文字キーをフックしようとして失敗したシアノンがお送りいたしましたorz

ばかなっ!何をしている!

最初はテンキー側の文字キーを押してキーを発行させる方法ないかなーっと色々調べてたんですけど・・・


色々試した後、そういえばoriさんのW-ZERO3 Holicでshkeybd.dllがd2keybd.dllがと思い出す。

HookKeyHookのソースを見て、こんなところ書き換えてやるとそう動くんだー、とか見て

もしかしたらshkeybd.dllに文字キー押したときに反応するイベント名が書いてあるかも!?と期待して

バイナリエディタで引っ張ってきて、文字列取得して、OpenEventでイベント自体があるかないか調べてみた。

引っかかったイベント名を見て何じゃこりゃ、さっぱり分からん状態だったので、その内の一つをググってみたら

mozurinさんのtDiary::mozurinに飛んで

1年以上前にもう解析されてたのねと思いつつ、LedDrvContinueEventVib0に目が行って

なるほど、こうやってバイブできるのかーと試しつつ、このバイブは定期的には振動するけど連続で振動しないな、どうやるんだろうと調べ、

結果tauchi.net: LED制御のページが見つかり、NLedSetDeviceで制御できるのね、と分かり、

LEDとバイブレータのオン、オフ、トグルを指定時間行うだけのアプリを作ろうとして、

俺何やってん(ry

XiCopyMenu ver.0.0.3

ダウンロード
[公開停止]


コピー、切り取り、貼り付け、削除、元に戻す、やり直しのポップアップメニューを好きな位置に表示させるだけのアプリです。


更新履歴

  • ポップアップを表示して選択するとIMEが「_A」、「_a」、「_1」しか選択できなくなっていた不具合を修正した。
  • ポップアップメニューの項目が選択できなくなるアプリがあったのですべてのアプリで選択できるように修正した。
  • 「元に戻す」、「やり直し」を追加した。


「_A」、「_a」、「_1」はすぐに直せるかと思ったら、かなり時間が掛かってしまいましたorz
更新ついでに「元に戻す」、「やり直し」を追加しておきました。
メニュー項目をiniファイルで指定できるようにすると面白いかな?

QuickMenuを使用した状態でサイドボタンを画面回転に割り当てる

Ad[es]でQuickMenuを起動させると、サイドボタン(短押し)がQuickMenu表示に勝手に変わってしまいます。
具体的には、起動時、オプション変更時、終了時に、レジストリ「HKEY_LOCAL_MACHINE\Software\Microsoft\Shell\Keys」の値が「\Windows\AppButtons\QuickMenu.lnk」に変わってしまうのと、「HKEY_LOCAL_MACHINE\Software\Microsoft\Shell\Keys\40c3」の値が「0」に変わってしまいます(タイミングやレジストリ書換場所は他にもあるかもしれませんが)。
この勝手に変わってしまうサイドボタン(短押し)を標準の画面回転にしようと、SortInchKeyでAPP3キーの短押しに画面回転を割り当てたいのですが、画面を左にトグル回転させるアプリが見つかりませんでした(WkTASKでパラメータ指定すればできますが・・・)。
なので、ただ画面を回転させるだけのアプリを作成しました。
XiScreenRotate ver.0.0.1 - シアノンとAd[es]の気まぐれ日記
APP3の短押しにXiScreenRotateを割り当てるとサイドボタンが標準の動作と同じようになります。

コード 同時コード 短押し 長押し
APP3 アプリ実行:XiScreenRotate.exe

[追記]
画面回転させるための他アプリ


ところで、ついでですので、私のQuickMenuのキー割り当てについても書いておきたいと思います。
私の場合は、WINキーはHYPERやSHIFTモード切り替えとして使用してしまっているので、「WIN→UP」でQuickMenuを起動(実際にはWINキークリック)をさせるようにしています。
ここでもう一つ。
QuickMenuを使えば通常のスタートメニューは使用しないとは思いますが、念のために「WIN→UP(長押し)」に割り当てました。
QuickMenuを使用している時でも通常のスタートメニューを表示させるには、WINキー以外でスタートメニューを出す方法 - シアノンとAd[es]の気まぐれ日記に書いてあります。

Define
START 0x5c+0x20
コード 同時コード 短押し 長押し
UP HYPER キークリック:WIN キークリック:START