t100のプログラミング脱出作戦

自分のプログラミング脳をプログラムにして、いつかプログラミングから脱出してやるぞっ!とか夢見ながら、日々プログラム作っていく 百野 貴博 の日記です!今は、屋号『百蔵。』として、Silverlight・WPFを追跡中です! (2007/09/30)
スポンサーサイト
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
【--/--/-- --:--】 | スポンサー広告 | トラックバック(-) | コメント(-) top↑
タスクトレイに常駐するアプリ開発した時のメモ
今回、Vaio Type Z チャタリングキャンセラーは、以下の要素の組み合わせで作っています。

・Windowsのキーボードイベントをキャッチする方法(SetWindowsHookEx関数)
・システム時刻をミリ秒単位で取得する方法。(前回キー押下時間と差分を計るため)
・タスクトレイに常駐するアプリケーションの作成方法。

それぞれ、いろんなサイトで丁寧に解説されていたので
それらの情報を組み合わせて、アプリケーション完成までたどり着くことが出来ました。
感謝です!

というわけで、ここでは参考にさせて頂いたサイトをまとめておきたいと思います。
#近いうちに、ソースコードも公開出来ればと思っています。
●Windowsのキーボードイベントをキャッチする方法

 Windowsのキーボードイベントをキャッチする方法には2種類あります。
 ・単一のアプリケーション内でキャッチする方法(ローカルフック)
 ・全てのアプリケーション内でキャッチする方法(グローバルフック)

 グローバルフックは、不具合があった際の影響範囲が大きいのと、デバッグの難しさがある為
 今回の開発では、まずはローカルフックするアプリケーションを作成して、動作確認してから
 グローバルフックに移行するようにしました。

 ローカルフック~グローバルフックまで、バッチリ解説されていたのがこちらのサイトです。
 アプリケーションの根幹は、ほとんどこちらのサイトの情報だけで完成できたと言っても過言ではありません。
 感謝!

 ・ローカルフック
 ・グローバルフック
 ・DLLの作成(グローバルフックに必要)
 ・第160章 メッセージフックの基礎


 一箇所、ローカルフックのSetWindowsHookEx関数呼び出しのコードが、グローバルフックになっていたようです。これまた、Google先生に教えてもらいました。
 SetWindowsHookExで質問

 訂正前:

m_hHook = ::SetWindowsHookEx( WH_KEYBOARD
, (HOOKPROC)CKeyboardHook::KeyboardProc
, NULL, 0 );


 訂正後:

m_hHook = ::SetWindowsHookEx( WH_KEYBOARD
, (HOOKPROC)CKeyboardHook::KeyboardProc
, NULL, GetCurrentThreadId());



●システム時刻をミリ秒単位で取得する方法。

 ミリ秒単位でシステム時刻を取得する方法は、実のところ良くわかりませんでした。(ダメ)
 今回のアプリケーションでは、timeGetTime関数 を使っています。

 これに関しては、こちらのサイトを参考にさせて頂きました。

 timeGetTimeの使い方
 時間の考え方
 timeGetTime(MSDN) 

 この関数は、「システムが起動してからの時間をミリ秒単位で返す」という仕様です。
 なんか、、、微妙な仕様・・・w
 桁あふれが発生した場合、0に戻るようなのでそうした絶妙なタイミングで不具合が発生する可能性は無きにしもあらずです。

 が、上記は処理が拘束で非常に制度が高いとい点と、循環するサイクルが 49.71 日であるという点
 そして、開発が簡単という3点(笑)で採用しました。

 つまり、49.71日の丁度循環のタイミングでキー連打した場合に、誤ってチャタリングと判定される可能性がある。
 という感じです。
 大丈夫だよね。。。タブン


●タスクトレイに常駐するアプリケーションの作成方法。

 タスクトレイに常駐するアプリケーションというのはつまり
 ・アプリケーション起動時にウィンドウが表示されない。
 ・タスクバーにも表示されない。
 ・タスクトレイにアイコンが表示される。
 ・タスクトレイのアイコンから、右クリックでメニュー出して終了できる。
 あたりが、肝になってきます。

 これら全てを、バッチリ解説して下さいっていたのがこちらのサイトです。

 つくってみよう-タスクトレイアプリケーションの作成
 ポップアップメニューを表示する
 「タスクトレイアイコンを表示する(常駐アプリケーションのために...)」

●アイコンを作って仕上げ!

 タスクトレイのアイコンは、以下のフリーソフトを使って編集させて頂きました。
 元の素材は、TypeZ 公式サイト から拝借したのは内緒です。(ダメ?)

 IcoFX Ver1.6 / フリーウェア


今回、最新のMFCを使った開発になってしまったので、ソフトウェア利用の際には
再配布ライブラリを別途インストールする必要が出てしまいました。

が、恐らく今回の内容くらいなら、Win32APIだけで開発可能なんだろうし
それが出来ていれば、もっと導入が簡単に出来たと思います。

精進が足らんな~。頑張らねば!

にゃま
>桁あふれが発生した場合、0に戻るようなのでそうした絶妙なタイミングで不具合が発生する可能性は無きにしもあらずです。

これとおなじ技使えんですか?
http://msdn.microsoft.com/ja-jp/library/cc429827.aspx

Example
次のサンプルコードは、タイマが 0 に戻る現象に対処する方法を示します。

DWORD dwStart = GetTickCount();

// 極端に長い時間が経過した場合は、実行を停止する。

if(GetTickCount() - dwStart>= TIMELIMIT)

Cancel();

ここで、TIMELIMIT は、アプリケーションが関心を持つ特定の経過時間を意味します。

2010/02/03(水) 13:33:21 | URL | [ 編集]
t100
おー。なるほど

確かにいいかもしれません!
ありがとうございます!
2010/03/04(木) 02:39:39 | URL | [ 編集]












管理者にだけ表示を許可する


トラックバックURL:
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。