C# 開機自啟動和最小化托盤顯示
一、 C# 開機自啟動
C# 開機自啟動,這個功能是大多數服務型軟體很常用一個功能,但是這個功能確是不
太好做,花了兩天想對策。不過最終呢,結果還是很滿意的。
這個功能要達到的效果是這樣的,所有使用者開機自啟動。
最初在網上找的資料都是修改登錄檔,基本上都是行如這樣的:
//獲取程式執行路徑..
string starupPath = Application.ExecutablePath; //class Micosoft.Win32.RegistryKey. 表示Window登錄檔中項級節點,此類是登錄檔裝. RegistryKey loca = Registry.LocalMachine; RegistryKey run = loca.CreateSubKey(@"SOFTWARE\Microsoft\Windows\CurrentVersion\Run"); try { //SetValue:儲存值的名稱 run.SetValue("qidong", starupPath); MessageBox.Show("已啟用開機執行!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information); loca.Close(); } catch (Exception ee) { MessageBox.Show(ee.Message.ToString(), "提示", MessageBoxButtons.OK, MessageBoxIcon.Error); }
結果我嘗試的時候,發現根本就不行,在SetValue這塊就出錯了,報錯的Message 是無訪問許可權,真的是折騰了很久,整UAC 許可權之類的,最後還是放棄了,這種寫法在XP 上還是可以成功的,因為XP 沒有UAC許可權的說法,而win7 這個許可權砍繞不過去。
嘗試第二種方法,通過註冊服務,讓服務啟動介面程式,這種方式貌似是可以的,只不過我沒有嘗試成功。有興趣的可以繼續試試。
嘗試第三種方法,就是將啟動的介面程式快捷方式拷貝到啟動目錄下,這種方式確實可以達到效果,但是當時考慮到會不會只對當前使用者有效,然後測試了下用另一賬戶登入,果然不行,這個時候,居然發現win7 下居然有一個所有使用者的啟動目錄,哎只怪自己太年輕了。我把快捷方式放置在該目錄下,居然正常執行。示例程式碼如下:
try { if (checkBoxReboot.Checked) { string StartupPath = System.Environment.GetFolderPath(System.Environment.SpecialFolder.CommonStartup); //獲得檔案的當前路徑 string dir = Directory.GetCurrentDirectory(); //獲取可執行檔案的全部路徑 string exeDir = dir + @"\EcgNetPlug.exe.lnk"; System.IO.File.Copy(exeDir, StartupPath + @"\EcgNetPlug.exe.lnk", true); } else { string StartupPath = System.Environment.GetFolderPath(System.Environment.SpecialFolder.CommonStartup); System.IO.File.Delete(StartupPath + @"\EcgNetPlug.exe.lnk"); } } catch(Exception ex)<br>{ MessageBox.Show(ex.Message); }
當然這種方式還是有點簡單粗暴,比如有的使用者想開機啟動,有的使用者又不想開機啟動,那怎麼辦,其實這種我們可以通過配置檔案和邏輯判斷肯定是可以實現的。
二、 最小化托盤顯示
這個我們要達到的效果是,啟動時隱藏,雙擊托盤顯示。
第一步:首先我們要建立一個空的winform 窗體。
第二步:向窗體拖動NotifyIcon 和 ContextMeauStrip 控制元件
第三步:最重要的一步,就是在NotifyIcon 屬性中選擇該ContextMeauStrip 控制元件,要不然右鍵NotifyIcon是出不來 選單的。並且設定Icon 圖示
第四步:給ContextMeauStrip 增加退出選單,並且增加響應函式
private void 退出ToolStripMenuItem_Click(object sender, EventArgs e)
{
this.Close();
}
第五步:讓窗體初始化的時候隱藏
private void Form1_Load(object sender, EventArgs e)
{
//隱藏窗體
this.WindowState = FormWindowState.Minimized;
}
private void Form1_Resize(object sender, EventArgs e)
{
if (this.WindowState == FormWindowState.Minimized)
{
this.Visible = false;
this.notifyIcon1.Visible = true;
}
}
第六步:給NotifyIcon 增加雙擊事件
private void notifyIcon1_MouseDoubleClick(object sender, MouseEventArgs e)
{
this.Visible = true;
this.WindowState = FormWindowState.Normal;
this.Show();
}
第七步:這是會看到圖示在工作列還存在,設定ShowInTaskbar 屬性為false.
第八步:大功告成。
原始碼下載: