最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C# winform程序?qū)崿F(xiàn)開機(jī)自啟動并且識別是開機(jī)啟動還是雙擊啟動

 更新時間:2018年10月29日 15:49:39   作者:碧水青荷  
這篇文章主要介紹了C# winform程序?qū)崿F(xiàn)開機(jī)自啟動并且識別是開機(jī)啟動還是雙擊啟動的實(shí)現(xiàn)代碼,代碼簡單易懂,非常不錯,具有一定的參考借鑒價值,需要的朋友可以參考下

開機(jī)啟動程序,在很多場合都會用到,尤其是那種在后臺運(yùn)行的程序。

效果圖:

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

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

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

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

【Main參數(shù)】

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

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

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

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

【注冊表操作】

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

核心代碼:

using System;
using Microsoft.Win32;
namespace AutoStartRun
{
  public sealed class SystemHelper
  {
    private SystemHelper() { }
    /// <summary>
    /// 設(shè)置程序開機(jī)啟動
    /// </summary>
    /// <param name="strAppPath">應(yīng)用程序exe所在文件夾</param>
    /// <param name="strAppName">應(yīng)用程序exe名稱</param>
    /// <param name="bIsAutoRun">自動運(yùn)行狀態(tài)</param>
    public static void SetAutoRun(string strAppPath, string strAppName, bool bIsAutoRun)
    {
      try
      {
        if (string.IsNullOrWhiteSpace(strAppPath)
          || string.IsNullOrWhiteSpace(strAppName))
        {
          throw new Exception("應(yīng)用程序路徑或名稱為空!");
        }
        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>
    /// 判斷是否開機(jī)啟動
    /// </summary>
    /// <param name="strAppPath">應(yīng)用程序路徑</param>
    /// <param name="strAppName">應(yīng)用程序名稱</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);
      }
    }
  }
}

 調(diào)用方法:

 /// <summary>
    /// 設(shè)置程序開機(jī)自啟動
    /// </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);
      }
    }    

設(shè)置開機(jī)啟動就是如此簡單。

【開機(jī)啟動并運(yùn)行】

 那這個就不用說了,將命令行參數(shù)和開機(jī)注冊表操作結(jié)合起來就可以了。

示例代碼:       

/// <summary>
    /// 檢查是否開機(jī)啟動,并設(shè)置控件狀態(tài)
    /// </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 = "我是開機(jī)自啟動運(yùn)行...";
        }
      }
    }

總結(jié)

以上所述是小編給大家介紹的C# winform程序?qū)崿F(xiàn)開機(jī)自啟動并且識別是開機(jī)啟動還是雙擊啟動,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復(fù)大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!

相關(guān)文章

  • C#遞歸算法尋找數(shù)組中第K大的數(shù)

    C#遞歸算法尋找數(shù)組中第K大的數(shù)

    首先將向量V從中間位置分開,分成左和右,分好后,中間值的索引如果恰恰等于K,就找到了,否則如果中間元素索引大于K,則在左子表中繼續(xù)查找,忽略右子表,如果中間值索引小于K,則在右子表中繼續(xù)查找,如此循環(huán)往復(fù)。
    2016-06-06
  • C#中事務(wù)處理和非事務(wù)處理方法實(shí)例分析

    C#中事務(wù)處理和非事務(wù)處理方法實(shí)例分析

    這篇文章主要介紹了C#中事務(wù)處理和非事務(wù)處理方法,較為詳細(xì)的分析了C#中事務(wù)處理與非事務(wù)處理的使用技巧,對于使用C#進(jìn)行數(shù)據(jù)庫程序開發(fā)有一定參考借鑒價值,需要的朋友可以參考下
    2015-07-07
  • C#中數(shù)組Array,ArrayList,泛型List詳細(xì)對比

    C#中數(shù)組Array,ArrayList,泛型List詳細(xì)對比

    關(guān)于數(shù)組Array,ArrayList,泛型List,簡單的說數(shù)組就是值對象,它存儲數(shù)據(jù)元素類型的值的一系列位置.Arraylist和list可以提供添加,刪除,等操作的數(shù)據(jù). 具體如何進(jìn)行選擇使用呢,我們來詳細(xì)探討下
    2016-06-06
  • 詳解StackExchange.Redis通用封裝類分享

    詳解StackExchange.Redis通用封裝類分享

    這篇文章主要介紹了詳解StackExchange.Redis通用封裝類分享 ,詳細(xì)的介紹了StackExchange.Redis通用封裝,具有一定的參考價值,有需要的可以了解一下。
    2016-12-12
  • C#實(shí)現(xiàn)判斷操作系統(tǒng)是否為Win8以上版本

    C#實(shí)現(xiàn)判斷操作系統(tǒng)是否為Win8以上版本

    這篇文章主要介紹了C#實(shí)現(xiàn)判斷操作系統(tǒng)是否為Win8以上版本,本文講解了利用C#獲取OS的版本號、利用反射獲取當(dāng)前正在運(yùn)行的程序的版本信息、 利用C#判斷當(dāng)前操作系統(tǒng)是否為Win8系統(tǒng)等內(nèi)容,需要的朋友可以參考下
    2015-06-06
  • C#利用ms office實(shí)現(xiàn)office轉(zhuǎn)pdf的示例代碼

    C#利用ms office實(shí)現(xiàn)office轉(zhuǎn)pdf的示例代碼

    這篇文章主要介紹了C#利用ms office實(shí)現(xiàn)office轉(zhuǎn)pdf的詳細(xì)方法,文中通過代碼示例和圖文講解的非常詳細(xì),對大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下
    2024-09-09
  • C#身份證號碼驗(yàn)證是否正確

    C#身份證號碼驗(yàn)證是否正確

    這一篇關(guān)于C#語言驗(yàn)證18位身份證號碼的驗(yàn)證方法和實(shí)例代碼,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2015-09-09
  • C#使用WebClient實(shí)現(xiàn)文件上傳的操作步驟

    C#使用WebClient實(shí)現(xiàn)文件上傳的操作步驟

    這篇文章主要介紹了C#使用WebClient實(shí)現(xiàn)文件上傳的操作步驟,文中通過代碼示例給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下
    2024-11-11
  • C#不提升自己程序的權(quán)限實(shí)現(xiàn)操作注冊表

    C#不提升自己程序的權(quán)限實(shí)現(xiàn)操作注冊表

    這篇文章主要介紹了C#不提升自己程序的權(quán)限實(shí)現(xiàn)操作注冊表的相關(guān)資料,需要的朋友可以參考下
    2022-12-12
  • C#泛型和反射實(shí)例解析

    C#泛型和反射實(shí)例解析

    這篇文章主要介紹了C#泛型和反射實(shí)例解析,對于C#初學(xué)者理解泛型和反射有很好的幫助借鑒作用,需要的朋友可以參考下
    2014-08-08

最新評論

长汀县| 邵武市| 江阴市| 西充县| 民县| 朝阳县| 崇义县| 寿光市| 咸宁市| 鹤峰县| 周宁县| 锡林浩特市| 静安区| 阜新| 延寿县| 佛学| 泾川县| 房产| 阿拉尔市| 太仓市| 临城县| 安多县| 余江县| 全南县| 华宁县| 乌拉特前旗| 东乡县| 繁昌县| 城固县| 阿巴嘎旗| 东乡族自治县| 健康| 吉木萨尔县| 岚皋县| 新绛县| 科技| 阜南县| 巴南区| 华亭县| 达拉特旗| 长岛县|