w-zero3日和

星羽がW-ZERO3、W-ZERO3[es]、その他モバイル端末を設定した時の覚え書きや自作アプリの公開など。

W-ZERO3でもアクションキー長押しでタップ&ホールドメニュー 03Action

2006年11月14日 | アプリ紹介
WindosMobile2003以前のPocketPCでは、アクションキー長押しすると、スタイラスで画面をタップ&ホールドした時と同じメニューが表示出来たのですが、W-ZERO3ではそれが出来なくなっています。その問題を解決するためにホーミンさんが作って下さったのが03Actionというアプリです。

03Action
  ダウンロード&解凍後に03Action.exeを適当なフォルダに入れて実行するだけ。これで03Actionが常駐します。
後はタップ&ホールドでポップアップメニューを出すように実装されているアプリ内であれば、アクションキー長押しで同様のメニューを出せるようになります☆
ちなみに、GSFinderではファイルをスタイラスでタップしてスタイラスを画面から離す前にそのファイルを実行してしまうようなので、ファイル実行後にタップ&ホールド時のメニューが表示されてしまうようです(残念
  • ウィンドウを持たないので、一度起動させたらタスク終了ソフト等では終了出来ません。
      ITaskMgrなど直接プロセスを終了させるソフトにて終了させて下さい。
    まぁ、一度常駐させたら終了することはないですし、もちろん本体を再起動すれば終了するので問題はないですね。
  • キーフックを利用したアプリなので、他のキーフックアプリ(PQzIIやctrlswapmini等)と一緒に利用する場合には、同じくホーミンさんの作られたmultikeyhookを設定して使って下さい。
      multikeyhookについてはa nomalyさんがこちらのページで詳しく解説してくれていますのでご参考になさって下さい☆

    また、こちらのページでは、03Actionについても紹介されています。a nomalyさんお得意のモーションGIFでの紹介がとても分かりやすいですね☆
    私も愛用中のPalmライクで使いやすいなスケジュールソフト”Offisnail Date”との相性はほんといい感じですよね。便利♪便利♪

    で、このアプリなのですが、メイン処理部分のソースも公開して下さっています。
    なるほど~と思いました。やっぱりホーミンさんは発想の転換力が違いますね(驚
    ソースをそのままここに記載するのは問題あると思うので、ソースは上記の03Actionのページを見ながらこの説明を読んでみて下さい。

    ◆03Actionの仕組み◆
      まず、キーコード確認ツールであるPQz_CHECKW-ZERO3でアクションキーを押して放すと以下のようなキーコードが返ってきます。

    (下の0x76DOWN/UPが3回出ているのは、分かりやすく赤丸をつけるためにAE Button Plus(シェアウェア:$7.99)でボリュームダウンキー3回押しにClearPaintを割り当てているからなので気にしないで下さい^^;)

    仮想キーコード表で確認してみると、
  • 0x86 → VK_F23
  • 0x0D → VK_RETURN
    だということが分かります。
    これを踏まえてホーミンさんのソースを見てみて下さい。

    【2006.11.16】ホーミンさんからいただいたコメントを元に修正、加筆させていただきました(感謝
    HookProcプロシージャでキーフック。

    PQz_CHECKの1行目 DOWN 0x86
      何かキーが押されて(WM_KEYDOWN)、さらにそのキーコードがVK_F23なら、アクションキーが押されたよフラグ(iAction)に2をセットした後に、keybd_eventでリターンキー押下をエミュレートして、CallNextHookExで次のキーコードをフックします。

    keybd_eventでエミュレートした WM_KEYDOWN 0x0D
      今度はキーコードが0x0D(VK_RETURN)なので、最初のif文は飛ばされるので、次のelse ifの方、キーコードがVK_RETURNで且つ、iActionに値が入っていたら、iActionの値がデクリメント(iAction=iAction-1)されるので、iAction=1となります。

    PQz_CHECKの2行目 DOWN 0x0D
      これもキーコードが0x0d(VK_RETURN)なので、最初のif文は飛ばされるので、次のelse ifの方、キーコードがVK_RETURNで且つ、iActionに値が入っていたら、iActionの値がデクリメント(iAction=iAction-1)されるので、iAction=0となるので、return 1でこのキーコードは無効になります。

    これらの処理で以下のように状態が変化します。
    普通の場合は、
    (アクションキーを押す)
    WM_KEYDOWN VK_F23
    (アクションキーを離す)
    WM_KEYDOWN VK_RETURN
    WM_KEYUP VK_RETURN
    WM_KEYUP VK_F23

    03Ationでは、
    (アクションキーを押す)
    WM_KEYDOWN VK_F23
    WM_KEYDOWN VK_RETURN
    (アクションキーを離す)
    WM_KEYDOWN VK_RETURN(無効)
    WM_KEYUP VK_RETURN
    WM_KEYUP VK_F23


    これで、アクションキーを押した時にリタンキーを押したことになり、アクションキー長押しで出るポップアップメニューが表示できるようになるわけですね☆

    タップ&ホールドメニュー自体をエミュレートする必要があるとずっと思っていたのですが、アクションボタンを押された時に発行されるキーコードに問題があっただけだったんですね(驚

    ↓以下、記事公開時の勘違い記事
    PQz_CHECKの3行目 UP 0x86
    PQz_CHECKの4行目 UP 0x0D
      今回はキー押下時だけ判定をしているので、これらのキーコードは無効となります。つまりこれで、アクションキーがずっと押されている状態になるのですが、先ほどまでの処理によってリターンキー長押しに変換されているので、タップ&ホールドメニューが表示されるという仕組みです。

    タップ&ホールドメニューで項目を選択
      現時点でまだiAction=1と値が残っていますよね。この状態でタップ&ホールドメニューで項目を選択することでリターンキーが押されるので、else ifの方でiActionがデクリメントされてiAction=0となり、最後の判定文によりHookProcプロシージャから抜けられます。
      ・・・ということはメニューで項目を選択(タップ)した時には0x86は発行されないで、0x0Dだけが発行されるのかな?もし、0x86も発行されているとしたらまたiAction=2になってしまいますし‥(すみません、ここだけ曖昧です。合ってるかなぁ(苦笑)



  • 最新の画像もっと見る

    4 コメント

    コメント日が  古い順  |   新しい順
    Unknown (ホーミン)
    2006-11-15 18:08:51
    ちょっと誤解されているようなので手抜きな解説

    まずCallNextHookExの機能ですが、CallNextHookExを呼ぶと次のフックに制御が移ります。最後のフックがCallNextHookExを呼ぶとフォーカスを持ったウィンドウのキューにWM_KEYDOWN、WM_KEYUPが送られます。
    まあ基本的にフックプロシジャは何もしない時はCallNextHookEx呼んでりゃいいってことです。

    03Actionのフックプロシジャがやってることは2つだけで
    ・WM_KEYDOWN VK_F23を受けた時点でkeybd_eventでVK_RETURN押しをエミュレート
    ・上の処理後二つ目のWM_KEYDOWN VK_RETURNだけを遮断する(return 1)

    フックプロシジャは下のように呼ばれるので、これと合わせてiActionの変化を考えれば特に難解なところはないと思います。

    (アクションキー押す)
    WM_KEYDOWN VK_F23
    WM_KEYDOWN VK_RETURN (自分が呼んだkeybd_eventが発生源)
    (アクションキー離す)
    WM_KEYDOWN VK_RETURN (これだけ遮断する)
    WM_KEYUP VK_RETURN
    WM_KEYUP VK_F23
    返信する
    お返事です (星羽)
    2006-11-16 03:43:18
    ◆ホーミンさんへ◆
    ホーミンさん自らのご解説、大変恐縮です!
    でも、自分で作ったアプリの仕組みについて他の人が書いた解説記事に誤りがあったら、コメントせざるをえませんものね。
    ご迷惑をお掛けすることになってしまい、すみませんです(汗
    でも,大変ためになりました。
    教えて下さってありがとうございますm(__)m

    最後のフックがCallNextHookExを呼んだ時に現在のウィンドウのキューに送られるわけですね。一つ一つのフックごとに送られるのだと勘違いしてました(苦笑
    記事の方も修正を加えさせていただきますね。
    返信する
    Unknown (はりー)
    2006-11-18 21:37:39
    こんばんは、コメントするのは初めてです、はりーと申します。
    以前ChgSuisokuが初代W-ZERO3でも使えたとトラバをさせていただいたんですが、追記で取り上げていただいていたということに今気づきました(^^;ありがとうございます。
    私の場合、タップ&ホールドのメニューはKOTETUさんのAppCloseで起動パラメータを「#M」にしたものを設定のメニューで登録しておいて、必要な時はそこから選ぶようにしていたりします。
    これだとGSFinderでも使えるんですが、スタートメニューを開かないといけないのでちょっと面倒なんですよね(^^;
    03Actionを使えば直感的に操作できそうでいいですねえ…ちょっと試してみよう…
    返信する
    お返事です (星羽)
    2006-11-19 01:53:05
    ◆はりーさんへ◆
    あ、あの方ですか☆
    ChgSuisoku+初代W-ZERO3+ATOKで試していただきありがとうございましたm(__)m

    実は私も以前はAppClose #Mを使っていたんですけど、この機能はタップ&ホールドメニューを出すわけではなくて、コンテキストメニューを出す機能なので、タップ&ホールドした時とは違うメニューが出ることがあったりしてちょっと不便だったんですよね。
    でも、この03Actionは確実にしかも現在のカーソル位置をタップ&ホールドした時のメニューが出てくれるのでとても便利になりました♪
    是非試してみて下さい☆
    返信する