[C#] スタートアップメニューにショートカットを登録する方法

画面デザイン

スタートアップメニューにショートカットを登録

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)でショートカットを作成する。
いろいろ方法があるので、詳しくは上記記事を参照。

Visual Studio

 
 

で、途中の説明は割愛し、最終的に出来上がったソースコードは以下の通り。

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にする。
スタートアップメニューにショートカットを登録

これで一件落着。

 
 

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA


*