在GG(高仿QQ)最早的版本中,我就加入了開機自動啟動的功能,是通過操作登錄檔來實現的,但是操作登錄檔需要管理員許可權,這樣,就表示必須以管理員的身份來執行GG客戶端。這對某些使用者來說可能接受不了,因為以這麼高的許可權來執行一個程式,使用者會覺得風險較大。而就從GG的角度來說,也只有在設定或取消開機啟動才需要這個許可權,而一開始就以管理員身份執行GG,就有點太誇張和浪費了。
一.方案進化
我開始想到的解決方案是,仍然以普通使用者的身份啟動GG,當需要操作登錄檔時,再提升至管理員許可權。後來通過查資料瞭解到:
(1)無法單獨提升某個執行緒的執行許可權,執行許可權是與程式繫結了。
(2)若要提升程式的許可權,必須在程式啟動時就設定。
這意味著要實現我的方案,必須在GG設定或取消開機啟動時,重啟GG程式。這也太不優雅了。繼續想辦法,最後讓我想到了一個巧妙的方案。思路如下:
(1)將GG中設定或取消開機啟動的功能(即需要管理員許可權的部分),做成一個單獨的控制檯程式AutoStart.exe,並且將其執行許可權配置為管理員。
(2)將AutoStart.exe放到與GG.exe的執行目錄。
(3)GG實現開機啟動功能的方法就是啟動AutoStart.exe程式,並通過啟動引數來傳遞相關資訊給AutoStart.exe程式。
二.方案實現
1.AutoStart.exe
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。
如果你覺得還不錯,請粉我,順便再頂一下啊