開機啓動程序,在不少場合都會用到,尤爲是那種在後臺運行的程序。api
效果圖:數組
以上兩幅圖都用到了命令行啓動程序,爲了模擬開機啓動或者其餘程序調用此程序。ide
第一幅圖:程序啓動能夠根據不一樣參數,執行不一樣的操做。若是是雙擊啓動,就自動運行邏輯代碼,若是是帶特定參數啓動,就自動運行邏輯代碼。函數
第二幅圖:winform 程序設置開機啓動,模擬雙擊啓動和開機啓動的不一樣效果。ui
開機啓動並自動運行方法:其實思路很簡單,就是將程序添加到註冊表中,這設置值的時候,加一個參數就能夠了。而後程序在入口函數處判斷啓動參數,若是有啓動參數,就走自動運行邏輯代碼,若是沒有,就只是程序啓動,並不運行邏輯代碼。this
在C/C++中,咱們很明確的知道 main(int argc, char *argv[]/*, char *envp[]*/) 函數有兩(三)個參數,第三個參數通常用得少,我是還沒用到過。因此常見的都是用兩個參數。第一個是參數個數,非負數。第二個是表示從執行環境傳遞給程序的各個實參。也就是說,咱們要用程序入口參數,只須要判斷argc的值,而後使用數組取argv的值就行。spa
那麼到了C#就變的更簡單了。直接變成 string[] 了。那麼你只要遍歷這個字符串數組就能夠了。.net
咱們用VS建立命令行工程的時候,若是是命令行程序那麼VS會默認使用帶參數的main函數:void Main(string [] args);若是是winform工程,VS是默認使用void Main()。其實不管默認使用哪一個都無所謂,主要是本身要清楚main函數的格式,以及表明的含義。main函數不光有參數,還能夠有返回值。其實咱們平時寫的C#工程中main函數看似沒有返回值,實際上是能夠帶有int類型的返回值的。若是你不清楚這一塊,傳送門。命令行
那若是咱們用的是 void Main() 這種形式咱們怎麼獲取程序入庫參數?這裏實際上是隻是一個表面現象。別覺得你不帶參數,我就獲取不到了 ^_^ 。微軟爲咱們提供了一個類:Environment。這個類比較強大。若是你還不清楚怎麼用,那去 MSDN 搜一下就會了。獲取命令行參數也就一個函數而已: string[] Environment.GetCommandLineArgs();使用這個方法須要注意就是返回值是數組類型,第一個元素包含正在執行的程序的文件名,從第二個參數開始,纔是命令行參數。其實這個辦法就恰好解決了 winform 程序中獲取命令行參數的問題。code
將程序啓動寫入註冊表實現開機啓動,這個感受沒什麼好說的。使用固定方法操做就行。不過用有一點須要注意就是在訪問註冊表的時候可能會提示沒有權限,你這個網上百度有好多方法。可是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