C# winform程序實現開機自啟動,並且識別是開機啟動還是雙擊啟動


開機啟動程序,在很多場合都會用到,尤其是那種在后台運行的程序。

效果圖:

 

 

以上兩幅圖都用到了命令行啟動程序,為了模擬開機啟動或者其他程序調用此程序。

第一幅圖:程序啟動可以根據不同參數,執行不同的操作。如果是雙擊啟動,就自動運行邏輯代碼,如果是帶特定參數啟動,就自動運行邏輯代碼。

第二幅圖:winform 程序設置開機啟動,模擬雙擊啟動和開機啟動的不同效果。

 

開機啟動並自動運行方法:其實思路很簡單,就是將程序添加到注冊表中,這設置值的時候,加一個參數就可以了。然后程序在入口函數處判斷啟動參數,如果有啟動參數,就走自動運行邏輯代碼,如果沒有,就只是程序啟動,並不運行邏輯代碼。

 

【Main參數】

   在C/C++中,我們很明確的知道 main(int argc, char *argv[]/*, char *envp[]*/) 函數有兩(三)個參數,第三個參數一般用得少,我是還沒用到過。所以常見的都是用兩個參數。第一個是參數個數,非負數。第二個是表示從執行環境傳遞給程序的各個實參。也就是說,我們要用程序入口參數,只需要判斷argc的值,然后使用數組取argv的值就行。

  那么到了C#就變的更簡單了。直接變成 string[] 了。那么你只要遍歷這個字符串數組就可以了。

  我們用VS創建命令行工程的時候,如果是命令行程序那么VS會默認使用帶參數的main函數:void Main(string [] args);如果是winform工程,VS是默認使用void Main()。其實無論默認使用哪個都無所謂,主要是自己要清楚main函數的格式,以及代表的含義。main函數不光有參數,還可以有返回值。其實我們平時寫的C#工程中main函數看似沒有返回值,其實是可以帶有int類型的返回值的。如果你不清楚這一塊,傳送門

  那如果我們用的是 void Main() 這種形式我們怎么獲取程序入庫參數?這里其實是只是一個表面現象。別以為你不帶參數,我就獲取不到了 ^_^ 。微軟為我們提供了一個類:Environment。這個類比較強大。如果你還不清楚怎么用,那去 MSDN 搜一下就會了。獲取命令行參數也就一個函數而已: string[] Environment.GetCommandLineArgs();使用這個方法需要注意就是返回值是數組類型,第一個元素包含正在執行的程序的文件名,從第二個參數開始,才是命令行參數。其實這個辦法就剛好解決了 winform 程序中獲取命令行參數的問題。

【注冊表操作】

將程序啟動寫入注冊表實現開機啟動,這個感覺沒什么好說的。使用固定方法操作就行。不過用有一點需要注意就是在訪問注冊表的時候可能會提示沒有權限,你這個網上百度有好多方法。但是MSDN中也給出了方法。就是在工程的中添加應用程序文件清單中修改一句就可以了。

 

核心代碼:

using System;
using Microsoft.Win32;

namespace AutoStartRun
{
    public sealed class SystemHelper
    {
        private SystemHelper() { }

        /// <summary>
        /// 設置程序開機啟動
        /// </summary>
        /// <param name="strAppPath">應用程序exe所在文件夾</param>
        /// <param name="strAppName">應用程序exe名稱</param>
        /// <param name="bIsAutoRun">自動運行狀態</param>
        public static void SetAutoRun(string strAppPath, string strAppName, bool bIsAutoRun)
        {
            try
            {
                if (string.IsNullOrWhiteSpace(strAppPath)
                    || string.IsNullOrWhiteSpace(strAppName))
                {
                    throw new Exception("應用程序路徑或名稱為空!");
                }

                RegistryKey reg = Registry.LocalMachine;
                RegistryKey run = reg.CreateSubKey(@"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run\");

                if (bIsAutoRun)
                {
                    run.SetValue(strAppName, strAppPath);
                }
                else
                {
                    if (null != run.GetValue(strAppName))
                    {
                        run.DeleteValue(strAppName);
                    }
                }

                run.Close();
                reg.Close();
            }
            catch (Exception ex)
            {
                throw new Exception(ex.Message, ex);
            }
        }

        /// <summary>
        /// 判斷是否開機啟動
        /// </summary>
        /// <param name="strAppPath">應用程序路徑</param>
        /// <param name="strAppName">應用程序名稱</param>
        /// <returns></returns>
        public static bool IsAutoRun(string strAppPath, string strAppName)
        {
            try
            {
                RegistryKey reg = Registry.LocalMachine;
                RegistryKey software = reg.OpenSubKey(@"SOFTWARE");
                RegistryKey run = reg.OpenSubKey(@"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run\");
                object key = run.GetValue(strAppName);
                software.Close();
                run.Close();
                if (null == key || !strAppPath.Equals(key.ToString()))
                {
                    return false;
                }
                return true;
            }
            catch (Exception ex)
            {
                throw new Exception(ex.Message, ex);
            }
        }
    }
}

 調用方法:

        /// <summary>
        /// 設置程序開機自啟動
        /// </summary>
        private void SetAutoRun()
        {
            string strFilePath = Application.ExecutablePath;
            string strFileName = System.IO.Path.GetFileName(strFilePath);

            try
            {
                SystemHelper.SetAutoRun(strFilePath + " -autostart", strFileName, !menuAutoRun.Checked);
                menuAutoRun.Checked = !menuAutoRun.Checked;
            }
            catch (Exception ex)
            {
                MessageBox.Show(this, ex.Message, "錯誤提示", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }        

設置開機啟動就是如此簡單。

【開機啟動並運行】

 那這個就不用說了,將命令行參數和開機注冊表操作結合起來就可以了。

示例代碼:

        /// <summary>
        /// 檢查是否開機啟動,並設置控件狀態
        /// </summary>
        private void CheckAutoRun()
        { 
            string strFilePath = Application.ExecutablePath;
            string strFileName = System.IO.Path.GetFileName(strFilePath);

            if (SystemHelper.IsAutoRun(strFilePath + " -autostart", strFileName))
            {
                menuAutoRun.Checked = true;
            }
            else
            {
                menuAutoRun.Checked = false;
            }
        }

        private void AutoRun()
        {
            if (menuAutoRun.Checked)
            {
                string[] strArgs = Environment.GetCommandLineArgs();
                if (strArgs.Length >= 2 && strArgs[1].Equals("-autorun"))
                {
                    labText.Text = "我是開機自啟動運行...";
                }
            }
        }

 

 獻上 demo

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM