在GG(高仿QQ)最先的版本中,我就加入了開機自動啓動的功能,是經過操做註冊表來實現的,可是操做註冊表須要管理員權限,這樣,就表示必須以管理員的身份來運行GG客戶端。這對某些用戶來講可能接受不了,由於以這麼高的權限來運行一個程序,用戶會以爲風險較大。而就從GG的角度來講,也只有在設置或取消開機啓動才須要這個權限,而一開始就以管理員身份運行GG,就有點太誇張和浪費了。html
我開始想到的解決方案是,仍然以普通用戶的身份啓動GG,當須要操做註冊表時,再提高至管理員權限。後來經過查資料瞭解到:spa
(1)沒法單獨提高某個線程的運行權限,運行權限是與進程綁定了。線程
(2)若要提高進程的權限,必須在進程啓動時就設定。code
這意味着要實現個人方案,必須在GG設置或取消開機啓動時,重啓GG進程。這也太不優雅了。繼續想辦法,最後讓我想到了一個巧妙的方案。思路以下:orm
(1)將GG中設置或取消開機啓動的功能(即須要管理員權限的部分),作成一個單獨的控制檯程序AutoStart.exe,而且將其運行權限配置爲管理員。htm
(2)將AutoStart.exe放到與GG.exe的運行目錄。blog
(3)GG實現開機啓動功能的方法就是啓動AutoStart.exe進程,並經過啓動參數來傳遞相關信息給AutoStart.exe進程。進程
1.AutoStart.exeget
AutoStart.exe是一個控制檯程序,我將其實現爲一個可複用的應用程序,你們能夠直接從文末下載複用。其源碼至關簡單,以下所示:源碼
/// <summary> /// 第一個參數爲exe的名稱,第二個參數爲bool值,表示是否自動啓動 /// </summary> static void Main(string[] args) { try { bool autoStart = bool.Parse(args[1]); Console.WriteLine(string.Format("正在{0}自動啓動 {1} . . .", autoStart ? "設置" : "取消" ,args[0]) ); //操做註冊表,須要使用管理員身份啓動程序。 RunWhenStart_usingReg(autoStart, args[0], AppDomain.CurrentDomain.BaseDirectory + args[0]); Console.WriteLine(""); Console.WriteLine("操做完成! 按任意鍵退出 . . ."); Console.ReadLine(); } catch(Exception ee) { Console.WriteLine("操做時發生異常:" + ee.Message + " 按任意鍵退出 . . ."); Console.ReadLine(); } } #region 開機自動啓動 /// <summary> /// 開機自動啓動,使用註冊表 /// </summary> /// <param name=\"Started\">是否開機自動啓動</param> /// <param name=\"name\">取一個惟一的註冊表Key名稱</param> /// <param name=\"path\">啓動程序的完整路徑</param> public static void RunWhenStart_usingReg(bool started, string name, string path) { RegistryKey HKLM = Registry.LocalMachine; try { RegistryKey run = HKLM.CreateSubKey("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run\\"); if (started) { run.SetValue(name, path); } else { object val = run.GetValue(name); if (val != null) { run.DeleteValue(name); } } } finally { HKLM.Close(); } } #endregion
若是不知道如何將AutoStart.exe配置爲以管理員身份啓動,能夠參考這篇文章。
2.在GG中調用AutoStart.exe
當用戶都選上或去掉勾選"開機自動啓動"時,程序執行以下操做:
if (autoStartChanged) { string args = string.Format("{0} {1}", "GG.exe", autoStart? "true":"false"); Process.Start(AppDomain.CurrentDomain.BaseDirectory + "AutoStart.exe", args); }
運行效果截圖:
PS:QQ的自動啓動是怎麼實現的了?它彷佛不須要管理員權限,有知道的朋友拜託留言告訴一下啊,謝謝!
你們有什麼問題和建議,能夠留言,也能夠發送email到我郵箱:ggim2013@163.com。
若是你以爲還不錯,請粉我,順便再頂一下啊