Google

2007年9月23日日曜日

常駐ルーチン作成中

要望として、サスペンド復帰時に自動起動して欲しい、ていうのがありまして
確かにそれ便利ね・・・と思うので、作成に挑戦。

とりあえずやることは・・・プログラム上で時計の起動・終了を可能とする辺りから。
今はプログラム起動で問答無用で時計出して、クリックとかで問答無用でプログラム自体の終了をする状態なんですな。

んで、ソースの各種処理関数の位置を色々修正して・・・つまりは整理整頓。
それから時計非表示状態の時は使用メモリを極力使わないように、ってことでメモリ確保と開放の処理を組み込み。mallocとfreeですな。
ついでに時計表示時の変数の使い方とかメモリ確保の処理も色々修正したところ
通常起動している状態で消費メモリが5MBほどだったのが2MBちょいまで減少。
モバイル機の搭載メモリを考えると・・・結構メモリくってたのね・・・。

さて、常駐する・・・てことで、常駐させる方法としては起動時の引数を用意する形に。
引数なしで起動したときは、これまでの時計表示→画面タップで終了の流れを保持しつつ、
常駐用の引数をもって起動したときには、たとえばmode=1として常駐モードとして起動。
常駐モードの時は、時計はいきなり表示させない状態に。
でも時計表示出さないと画面タップでの終了が出来ないので、常駐モード起動の終了方法としては、常駐モード用引数による多重起動で終了という形に。
多重起動判定ルーチンを利用して、多重起動したときに元のウィンドウに独自にイベントを発行してやることで判定です。
こんな感じ↓
PostMessage(hwnd, WM_DUPEXEC_NOTIFY, ExecMode, 0);

んで、多重起動モードではイベント受け取るために目に見えないウィンドウを作成するわけですが(MoveWindow( hWnd, 0, 0, 0, 0, FALSE );でサイズ0にしてます)、このままだと起動してるかも分からないので、タスクトレイにアイコンを表示することに。
こんな感じ↓
Shell_NotifyIcon(NIM_ADD, &nid);
ちなみに終了時は↓で表示解除。
Shell_NotifyIcon(NIM_DELETE, &nid);
タスクトレイに表示されているアイコンに対しては、クリックするとかでイベントを送ったりも出来ますが、
とりあえずこの状態で時計を表示したり、非表示にしたりの繰り返しが出来るように試しているところ・・・で今現在止まっております。トライアンドエラーでココまで来ておりますが・・・意外と大変ですなぁ・・・初めてのプログラムで知らないことだらけだから・・・まぁ、やりがいはあるですが~。

さて・・・次はいつソース触れるだろうか・・・最近実生活が忙しくなりそうな匂いがしてるからなぁ・・・。

0 件のコメント: