C# winform程序?qū)崿F(xiàn)開機(jī)自啟動(dòng)并且識(shí)別是開機(jī)啟動(dòng)還是雙擊啟動(dòng)
開機(jī)啟動(dòng)程序,在很多場(chǎng)合都會(huì)用到,尤其是那種在后臺(tái)運(yùn)行的程序。
效果圖:
以上兩幅圖都用到了命令行啟動(dòng)程序,為了模擬開機(jī)啟動(dòng)或者其他程序調(diào)用此程序。
第一幅圖:程序啟動(dòng)可以根據(jù)不同參數(shù),執(zhí)行不同的操作。如果是雙擊啟動(dòng),就自動(dòng)運(yùn)行邏輯代碼,如果是帶特定參數(shù)啟動(dòng),就自動(dòng)運(yùn)行邏輯代碼。
第二幅圖:winform 程序設(shè)置開機(jī)啟動(dòng),模擬雙擊啟動(dòng)和開機(jī)啟動(dòng)的不同效果。
開機(jī)啟動(dòng)并自動(dòng)運(yùn)行方法:其實(shí)思路很簡(jiǎn)單,就是將程序添加到注冊(cè)表中,這設(shè)置值的時(shí)候,加一個(gè)參數(shù)就可以了。然后程序在入口函數(shù)處判斷啟動(dòng)參數(shù),如果有啟動(dòng)參數(shù),就走自動(dòng)運(yùn)行邏輯代碼,如果沒(méi)有,就只是程序啟動(dòng),并不運(yùn)行邏輯代碼。
【Main參數(shù)】
在C/C++中,我們很明確的知道 main(int argc, char *argv[]/*, char *envp[]*/) 函數(shù)有兩(三)個(gè)參數(shù),第三個(gè)參數(shù)一般用得少,我是還沒(méi)用到過(guò)。所以常見的都是用兩個(gè)參數(shù)。第一個(gè)是參數(shù)個(gè)數(shù),非負(fù)數(shù)。第二個(gè)是表示從執(zhí)行環(huán)境傳遞給程序的各個(gè)實(shí)參。也就是說(shuō),我們要用程序入口參數(shù),只需要判斷argc的值,然后使用數(shù)組取argv的值就行。
那么到了C#就變的更簡(jiǎn)單了。直接變成 string[] 了。那么你只要遍歷這個(gè)字符串?dāng)?shù)組就可以了。
我們用VS創(chuàng)建命令行工程的時(shí)候,如果是命令行程序那么VS會(huì)默認(rèn)使用帶參數(shù)的main函數(shù):void Main(string [] args);如果是winform工程,VS是默認(rèn)使用void Main()。其實(shí)無(wú)論默認(rèn)使用哪個(gè)都無(wú)所謂,主要是自己要清楚main函數(shù)的格式,以及代表的含義。main函數(shù)不光有參數(shù),還可以有返回值。其實(shí)我們平時(shí)寫的C#工程中main函數(shù)看似沒(méi)有返回值,其實(shí)是可以帶有int類型的返回值的。如果你不清楚這一塊,傳送門。
那如果我們用的是 void Main() 這種形式我們?cè)趺传@取程序入庫(kù)參數(shù)?這里其實(shí)是只是一個(gè)表面現(xiàn)象。別以為你不帶參數(shù),我就獲取不到了 ^_^ 。微軟為我們提供了一個(gè)類:Environment。這個(gè)類比較強(qiáng)大。如果你還不清楚怎么用,那去 MSDN 搜一下就會(huì)了。獲取命令行參數(shù)也就一個(gè)函數(shù)而已: string[] Environment.GetCommandLineArgs();使用這個(gè)方法需要注意就是返回值是數(shù)組類型,第一個(gè)元素包含正在執(zhí)行的程序的文件名,從第二個(gè)參數(shù)開始,才是命令行參數(shù)。其實(shí)這個(gè)辦法就剛好解決了 winform 程序中獲取命令行參數(shù)的問(wèn)題。
【注冊(cè)表操作】
將程序啟動(dòng)寫入注冊(cè)表實(shí)現(xiàn)開機(jī)啟動(dòng),這個(gè)感覺沒(méi)什么好說(shuō)的。使用固定方法操作就行。不過(guò)用有一點(diǎn)需要注意就是在訪問(wèn)注冊(cè)表的時(shí)候可能會(huì)提示沒(méi)有權(quán)限,你這個(gè)網(wǎng)上百度有好多方法。但是MSDN中也給出了方法。就是在工程的中添加應(yīng)用程序文件清單中修改一句就可以了。
核心代碼:
using System; using Microsoft.Win32; namespace AutoStartRun { public sealed class SystemHelper { private SystemHelper() { } /// <summary> /// 設(shè)置程序開機(jī)啟動(dòng) /// </summary> /// <param name="strAppPath">應(yīng)用程序exe所在文件夾</param> /// <param name="strAppName">應(yīng)用程序exe名稱</param> /// <param name="bIsAutoRun">自動(dòng)運(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ī)啟動(dòng) /// </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ī)自啟動(dòng) /// </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, "錯(cuò)誤提示", MessageBoxButtons.OK, MessageBoxIcon.Error); } }
設(shè)置開機(jī)啟動(dòng)就是如此簡(jiǎn)單。
【開機(jī)啟動(dòng)并運(yùn)行】
那這個(gè)就不用說(shuō)了,將命令行參數(shù)和開機(jī)注冊(cè)表操作結(jié)合起來(lái)就可以了。
示例代碼:
/// <summary> /// 檢查是否開機(jī)啟動(dòng),并設(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ī)自啟動(dòng)運(yùn)行..."; } } }
總結(jié)
以上所述是小編給大家介紹的C# winform程序?qū)崿F(xiàn)開機(jī)自啟動(dòng)并且識(shí)別是開機(jī)啟動(dòng)還是雙擊啟動(dòng),希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)我們網(wǎng)站的支持!
上一篇:C#中通過(guò)LRU實(shí)現(xiàn)通用高效的超時(shí)連接探測(cè)
欄 目:C#教程
下一篇:C#實(shí)現(xiàn)二叉排序樹代碼實(shí)例
本文標(biāo)題:C# winform程序?qū)崿F(xiàn)開機(jī)自啟動(dòng)并且識(shí)別是開機(jī)啟動(dòng)還是雙擊啟動(dòng)
本文地址:http://mengdiqiu.com.cn/a1/C_jiaocheng/5017.html
您可能感興趣的文章
- 01-10WinForm限制窗體不能移到屏幕外的方法
- 01-10WinForm繪制圓角的方法
- 01-10C#實(shí)現(xiàn)txt定位指定行完整實(shí)例
- 01-10WinForm實(shí)現(xiàn)仿視頻 器左下角滾動(dòng)新聞效果的方法
- 01-10C#實(shí)現(xiàn)清空回收站的方法
- 01-10C#實(shí)現(xiàn)讀取注冊(cè)表監(jiān)控當(dāng)前操作系統(tǒng)已安裝軟件變化的方法
- 01-10C#實(shí)現(xiàn)多線程下載文件的方法
- 01-10C#實(shí)現(xiàn)Winform中打開網(wǎng)頁(yè)頁(yè)面的方法
- 01-10C#實(shí)現(xiàn)遠(yuǎn)程關(guān)閉計(jì)算機(jī)或重啟計(jì)算機(jī)的方法
- 01-10C#自定義簽名章實(shí)現(xiàn)方法


閱讀排行
- 1C語(yǔ)言 while語(yǔ)句的用法詳解
- 2java 實(shí)現(xiàn)簡(jiǎn)單圣誕樹的示例代碼(圣誕
- 3利用C語(yǔ)言實(shí)現(xiàn)“百馬百擔(dān)”問(wèn)題方法
- 4C語(yǔ)言中計(jì)算正弦的相關(guān)函數(shù)總結(jié)
- 5c語(yǔ)言計(jì)算三角形面積代碼
- 6什么是 WSH(腳本宿主)的詳細(xì)解釋
- 7C++ 中隨機(jī)函數(shù)random函數(shù)的使用方法
- 8正則表達(dá)式匹配各種特殊字符
- 9C語(yǔ)言十進(jìn)制轉(zhuǎn)二進(jìn)制代碼實(shí)例
- 10C語(yǔ)言查找數(shù)組里數(shù)字重復(fù)次數(shù)的方法
本欄相關(guān)
- 01-10C#通過(guò)反射獲取當(dāng)前工程中所有窗體并
- 01-10關(guān)于ASP網(wǎng)頁(yè)無(wú)法打開的解決方案
- 01-10WinForm限制窗體不能移到屏幕外的方法
- 01-10WinForm繪制圓角的方法
- 01-10C#實(shí)現(xiàn)txt定位指定行完整實(shí)例
- 01-10WinForm實(shí)現(xiàn)仿視頻 器左下角滾動(dòng)新
- 01-10C#停止線程的方法
- 01-10C#實(shí)現(xiàn)清空回收站的方法
- 01-10C#通過(guò)重寫Panel改變邊框顏色與寬度的
- 01-10C#實(shí)現(xiàn)讀取注冊(cè)表監(jiān)控當(dāng)前操作系統(tǒng)已
隨機(jī)閱讀
- 01-10C#中split用法實(shí)例總結(jié)
- 01-11Mac OSX 打開原生自帶讀寫NTFS功能(圖文
- 04-02jquery與jsp,用jquery
- 08-05DEDE織夢(mèng)data目錄下的sessions文件夾有什
- 08-05織夢(mèng)dedecms什么時(shí)候用欄目交叉功能?
- 01-11ajax實(shí)現(xiàn)頁(yè)面的局部加載
- 01-10使用C語(yǔ)言求解撲克牌的順子及n個(gè)骰子
- 01-10delphi制作wav文件的方法
- 01-10SublimeText編譯C開發(fā)環(huán)境設(shè)置
- 08-05dedecms(織夢(mèng))副欄目數(shù)量限制代碼修改