Visual C++ 2008 MFCです。
起動するとタスクトレイに常駐するアプリケーションを
MFCで作成しようとしています。
そちら自体の作成方法は、ネット上のサンプルなどを元にして、
最低限の動き自体は実装できているのですが、
このアプリケーションのタスクトレイメニューから起動される設定ダイアログに
「スタートアップに登録する」というチェックボックスを置こうとしています。
スタートアップに登録されている項目は、レジストリ内の
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run
にあるようなのですが、ここに自分自身を登録する場合、
なにか用意されている仕組みがあるのでしょうか?
それとも、このパスを固定で指定してレジストリを直接操作するのでしょうか?
> それとも、このパスを固定で指定してレジストリを直接操作するのでしょうか?
そうです。
ところで、HKEY_CURRENT_USER に登録した方がいいと思います。ご検討くださいな。
レジストリに登録するという方法もありますが、
普通の常駐アプリでは、スタートアップフォルダに起動用の
ショートカットを作成する、という方法が一般的だと思います。
SHGetSpecialFolderLocation()というAPIがありますが、
これに「CSIDL_COMMON_STARTUP」という識別子を渡すと、
現在のスタートアップフォルダが取得できます。
APIの名前でググると、使い方やサンプルコードが見つかりますよ。
なお、この方法で保存したショートカットは、
「スタート」-「すべてのプログラム」-「スタートアップ」に表示されます。
そして、システムの起動時に実行されます。
> CSIDL_COMMON_STARTUP
CSIDL_STARTUP というのもあります。個人的にはこっち推奨。
COMMON の方は Vista 以降だと UAC をクリアする必要があります。
あと、Vista 以降の場合は SHGetKnownFolderPath という API もあります。
まぁこれ使うと XP で動かなくなるんですけど。
情報ありがとうございます。
> そうです。
了解しました。
レジストリで行くことになったときには、直接操作したいと思います。
> ところで、HKEY_CURRENT_USER に登録した方がいいと思います。
自分の環境では、「Acrobat Assistant」や「B'sCLiP」など、
すべてHKEY_LOCAL_MACHINEに入っていたので、
こっちに入れるほうが確実なのかなと思っていました。
仕様に照らし合わせて再検討させていただきます。
> 普通の常駐アプリでは、スタートアップフォルダに起動用の
> ショートカットを作成する、という方法が一般的だと思います。
スタートアップフォルダは、レジストリに登録する機能の無いアプリを
ユーザが自分で登録したいときに使うものなのかなと思っていましたが、
そういうわけでもないということなのですね。
たしかに、レジストリに登録すると、UACだのセキュリティソフトだのが
いろいろ警告を出してきそうですし、そちらの方法も調べてみようと思います。
HKLM や CSIDL_COMMON_STARTUP に登録したものは、どのユーザーでも共通です。
HKCU や CSIDL_STARTUP に登録したものは、現在のユーザーでログインした場合のみ実
行されます。
今回は
> タスクトレイメニューから起動される設定ダイアログに
> 「スタートアップに登録する」というチェックボックスを置こうとしています。
という、ログインユーザーの操作が必要なものなので、ユーザーごとの設定を推奨しま
した。
あるユーザーがその設定をしたら、別のユーザーでも自動起動するって気持ち悪くない
ですか?
> 「Acrobat Assistant」や「B'sCLiP」など、
というのがどういうソフトなのかよくわかりませんが、インストールしただけで自動実
行される類のものではありませんか?
そういう設計のソフトならば HKLM や CSIDL_COMMON_STARTUP が適していると思いま
す。
インストーラはどうせ管理者権限で動いているので UAC も問題ありませんし。
> レジストリに登録すると、UACだのセキュリティソフトだのが
> いろいろ警告を出してきそうですし、
セキュリティソフトはどうかわかりませんが、HKCU なら UAC は関係ありません。
> あるユーザーがその設定をしたら、別のユーザーでも自動起動するって気持ち悪くない
> ですか?
なるほどたしかにそのような流れになりますね。
今回のものは一般向けのソフトというわけではなく、
複数のユーザが使うPCは想定していなかったので、うっかりしていました。
レジストリを使うときには
HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Run
の中に直接登録するようにします。
指摘していただきありがとうございます。