Windows起動時にアプリを起動させたい場合、スタートアップメニューにアプリを登録することは良くあると思う。
でも、Windows 10や8.1などでは、スタートアップメニューへの登録方法が面倒というか分かりにくく、自作ソフトでもたまに問い合わせが来る。
インストーラでスタートアップに登録すれば確実なんだけど、フリーソフトでインストーラとかは嫌がられる場合も多く、作る手間も掛かる。
そんな訳で、アプリケーション側で、自分自身のショートカットをスタートアップメニューに登録する方法を調べてみた。
まずは、スタートメニューのフォルダを調べる方法。
// 特殊ディレクトリ(スタートアップ)のパスを取得する Environment.GetFolderPath(Environment.SpecialFolder.StartMenu)
Stringの値が返される。
例)C:\Users\<ユーザ名>\AppData\Roaming\Microsoft\Windows\Start Menu
そして、アプリ自身のexeファイル名の取得方法。
Path.GetFileName(Application.ExecutablePath)
Stringの値が返される。
例)sampleApl.EXE
あとは、exeのショートカットをスタートメニューのフォルダにコピーするだけ。
・・・。
あれ、どうやらC#やVB.NETではファイルのショートカットを作る機能が無いっぽい。
そういえば、前も似たようなことをやった記憶が。。
そうだ、これだ。
[C#] 送るメニューにショートカットを登録/解除する方法
この時も、ショートカット作成に苦労した。
なので、ショートカットの作成は、上記記事の「方法4」を流用し、WSH(Windows Script Host)でショートカットを作成する。
いろいろ方法があるので、詳しくは上記記事を参照。
で、途中の説明は割愛し、最終的に出来上がったソースコードは以下の通り。
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; // 追加 using System.IO; using System.Reflection; using System.Diagnostics; namespace sampleApl { public partial class Form1 : Form { private string aplTitle = null; // アプリ名 private string exeFile = null; // exeファイル名 private string jsFile = null; // スクリプトファイル名 private string lnkFile = null; // リンク名 private bool frmLoadFlg = false; // Form1ロード済みか public Form1() { InitializeComponent(); } /// <summary> /// フォームロード時の初期化処理 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void Form1_Load(object sender, EventArgs e) { // プロジェクト>プロパティ>アセンブリ情報 で指定した「タイトル」を取得 var assembly = Assembly.GetExecutingAssembly(); var attribute = Attribute.GetCustomAttribute( assembly, typeof(AssemblyTitleAttribute) ) as AssemblyTitleAttribute; aplTitle = attribute.Title; this.Text = aplTitle; // 自身のexeファイル名を取得 exeFile = Path.GetFileName(Application.ExecutablePath); // WSHスクリプト名 jsFile = Directory.GetParent(Application.ExecutablePath) + "\\addStartup.js"; // ショートカットのリンク名 String sMnu = Environment.GetFolderPath(Environment.SpecialFolder.Startup); lnkFile = sMnu + "\\" + aplTitle + ".lnk"; // [スタートアップ]フォルダのパスをtextBox1に表示 textBox1.Text = Environment.GetFolderPath(Environment.SpecialFolder.Startup); textBox1.ReadOnly = true; // スタートアップ有無 checkBox1.Checked = File.Exists(lnkFile); frmLoadFlg = true; } /// <summary> /// [スタートアップに登録]チェックボックスのチェック変更時 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void checkBox1_CheckedChanged(object sender, EventArgs e) { if (!frmLoadFlg) return; if (checkBox1.Checked) { // スタートアップフォルダにショートカット作成 try { // WSHファイル作成 using (StreamWriter w = new StreamWriter( jsFile, false, System.Text.Encoding.GetEncoding("shift_jis"))) { w.WriteLine("ws = WScript.CreateObject('WScript.Shell');"); w.WriteLine("ln = ws.SpecialFolders('Startup') + '\\\\' + '" + aplTitle + ".lnk';"); w.WriteLine("sc = ws.CreateShortcut(ln);"); w.WriteLine("sc.TargetPath = ws.CurrentDirectory + '\\\\" + exeFile + "';"); w.WriteLine("sc.Save();"); } // addStartup.jsを実行し、スタートアップにショートカット作成 if (File.Exists(jsFile)) { ProcessStartInfo psi = (new ProcessStartInfo()); psi.FileName = "cscript"; psi.Arguments = @"//e:jscript " + jsFile; psi.WindowStyle = ProcessWindowStyle.Hidden; Process p = Process.Start(psi); p.WaitForExit(10000); // 終了まで待つ(最大10秒) File.Delete(jsFile); } // スタートアップフォルダに登録されたか確認 if (File.Exists(lnkFile)) { MessageBox.Show( "スタートアップに登録しました。\n\n" + lnkFile, aplTitle, MessageBoxButtons.OK, MessageBoxIcon.Information); } else { MessageBox.Show( "スタートアップへの登録に失敗しました。\n\n" + lnkFile, aplTitle, MessageBoxButtons.OK, MessageBoxIcon.Warning); } } catch (Exception ex) { MessageBox.Show( "スタートアップへの登録に失敗しました。\n\n" + ex.Message, aplTitle, MessageBoxButtons.OK, MessageBoxIcon.Warning); } } else { // スタートアップフォルダに登録済みか確認 if (File.Exists(lnkFile)) { try { File.Delete(lnkFile); MessageBox.Show( "スタートアップから削除しました。", aplTitle, MessageBoxButtons.OK, MessageBoxIcon.Information); } catch (IOException ex) { MessageBox.Show( "スタートアップからの削除に失敗しました。\n\n" + ex.Message, aplTitle, MessageBoxButtons.OK, MessageBoxIcon.Warning); } } } // スタートアップ有無 checkBox1.Checked = File.Exists(lnkFile); } /// <summary> /// [閉じる]ボタン /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void button1_Click(object sender, EventArgs e) { // アプリケーションの終了 Application.Exit(); } } }
画面デザイン
ビルドしexeを実行すると、textBox1にショートカットメニューの格納先フォルダが表示される。
「スタートアップに登録」チェックボックスをONにすると、上記フォルダ上に、exeのショートカットを作成する。
これで、Windows起動時に、このexeが起動されるようになる。
あと、アプリ起動時にスタートアップフォルダをチェックしているので、スタートメニュー登録済みの場合、「スタートアップメニューに登録」がチェックONとなる。
スタートアップメニューから登録解除したい場合は、このチェックボックスをOFFにする。
これで一件落着。