プログラム話

ここのブログでは、XcrawlEx, BubbleTask, ScratchViewer, ClickPosとアプリを公開してきて、それぞれ、あまり他のアプリでは見ないような実装が入っています。
で、ClickPosはソースを公開したので、少し中身に関しての記事を。
 
ClickPosの一番のキモは「タップしたところを得る」方法です。
通常のアプリでは、自分のウィンドウを持っているため、WM_LBUTTONDOWNなどのメッセージを処理することで、タップした位置を簡単に取得できます。
ですが、ClickPosでは自分のウィンドウを持っていない(正確には、自分のウィンドウをタップして貰えない)ため、簡単にタップした位置を取得することができません。
Windowsのマウスカーソルなんかと同じかな?」と、GetCursorPos()を使ってみたものの、正しい値が帰ってきませんでした。
 
そこでClickPosでは、ホーミン氏作「MultiKeyHook」の機能を借りて、これを実現することにしました。
http://geocities.yahoo.co.jp/gl/hou_ming_2/view/20070906/1189012118
MultiKeyHookを導入すると、「WH_JOURNALRECORD」が使えます。どんなものなのかは適当に調べてもらうとして(手抜き)、入力イベントを監視するのに使えます。
 
ボクが調べた感じ、WindowsMobile6で、これ以外にタップ監視をする方法はなさそうです。
(あったとしたら同系統のソフトはとっくに出ているハズ…いや、あるのかもしれないけど)
 
使い方は、いわゆるキーフックと同じく、SetWindowsHookEx()を呼び出すだけ。
ただし、普通のWindowsMobileSDKには定義されていないので、CEのプラットホームSDKにPATHを通して pwinuser.h を使えるようにするか、SekWindowsHookEx()関数と、WH_JOURNALRECORD を定義してください。(ボクは前者でコーディングしています)
 
これさえわかれば、後は特に変なことはやっていません。多数のコメントを含めて483行と、Windowsプログラムとしてはかなり短い部類のソースなので(しかも大半がVS2005が出力するスケルトンプログラム)、読むのは簡単かと思います。
 
2008/8/1のコメントにあるように、ダブルタップが使えなくなる問題や、タスク系アプリが反応する問題がありますが、適当に改造して使って下さい。
個人的にはダブルタップが必要無いため、これらの問題に気づきませんでした。時間が取れれば色々手を加えたり完成度高めたいところなのですが、きっと無理なので(苦笑)。
 
そういえば、MultiKeyHookでWH_JOURNALRECORD使ったのって、ClickPosが最初なのかな。ツールMEMOさんで、メリットがわからないと書かれていたので、トラックバックしておこうっと。
http://d.hatena.ne.jp/solipt/20070906/