先日、電話がつながったときにバイブで知らせる「通話ブル」というソフトを作ったんですが、常駐ソフトにできないかというコメントをいただきました。
確かにこういうソフトは常に起動されている方が便利かなと思ったんですが、常駐型のソフトを作る方法が見当たらない…。
常駐ソフトについて考えてみました。
<課題1 フォームを非表示にする>
いくつか常駐型ソフトを調べてみたところ、実行中のプログラム一覧に出てこない。フォームをMe.Hide()で消すことで、実行中のプログラム一覧からは見えなくなった。
設定するときはフォームを表示したい。
ソフト起動中にEXEファイルをクリックすると、二重起動されずに起動中のフォームがアクティブになった。
Form_Loadイベントは発生しないが、Form_Activatedイベントは発生していた。
フォームが非表示中でもActivatedイベントは発生したので、Form_Activatedで Me.Show() を入れることにした。
追記)フォームにコントロールがあるとActivatedイベントが発生しないことがわかった(>_<)
<課題2 スタートアップに登録する>
スタートアップに登録すれば、リセットしたときにもソフトが自動実行される。
.NetでCABファイルインストーラを作ればスタートアップへのショートカットも簡単に配置できる。
http://www.willcom-fan.com/wzero3/entries/staff/000235/
第15回 インストーラーを作る(ウィルコムファン W-ZERO3さん)
<課題3 スタートアップから起動時だけ非表示にする>
スタートアップからの起動時は非表示にして、通常起動時は設定するために表示状態にしたい。
どうやって起動されたかを知ることはできないので、コマンドパラメータで「/hide」と指定されていた場合は非表示で起動することにした。
コマンドパラメータを取得する関数にCommand()というものがあったが、ビルドは通るのに実行時にエラーで落ちてしまう。
Sub Mainから起動するようにしてコマンドパラメータを取得することにした。
http://www.atmarkit.co.jp/fdotnet/dotnettips/031vbstartup/vbstartup.html
VB.NETでアプリケーション起動時に実行されるフォームを変更するには?
このページのサンプルのままだとコマンドパラメータが取れないので次のように改造。
Public Class Class1 Shared Sub Main(ByVal CmdArgs() As String) |
※全角スペースを使ってます。こぴぺするときは半角に置換して下さい。
/hide 指定時にフォームを非表示にするため、Form_LoadにMe.Hide()を指定したが非表示にならない??
仕方ないので、タイマーを発行してタイマーイベント内で非表示にすることにした。
これですべて解決と思ったら、インストーラを作るときにコマンドパラメータ付きショートカットが作れない???(>_<)
さてどうしよう。設定アプリと常駐アプリを分けて、常駐アプリを常に非表示起動にするか。