巧妙地利用進(jìn)程分離來(lái)設(shè)置程序開(kāi)機(jī)自動(dòng)啟動(dòng)?。ǜ皆创a)
當(dāng)前位置:點(diǎn)晴教程→知識(shí)管理交流
→『 技術(shù)文檔交流 』
在GG(高仿QQ)最早的版本中,我就加入了開(kāi)機(jī)自動(dòng)啟動(dòng)的功能,是通過(guò)操作注冊(cè)表來(lái)實(shí)現(xiàn)的,但是操作注冊(cè)表需要管理員權(quán)限,這樣,就表示必須以管理員的身份來(lái)運(yùn)行GG客戶端。這對(duì)某些用戶來(lái)說(shuō)可能接受不了,因?yàn)橐赃@么高的權(quán)限來(lái)運(yùn)行一個(gè)程序,用戶會(huì)覺(jué)得風(fēng)險(xiǎn)較大。而就從GG的角度來(lái)說(shuō),也只有在設(shè)置或取消開(kāi)機(jī)啟動(dòng)才需要這個(gè)權(quán)限,而一開(kāi)始就以管理員身份運(yùn)行GG,就有點(diǎn)太夸張和浪費(fèi)了。 一.方案進(jìn)化我開(kāi)始想到的解決方案是,仍然以普通用戶的身份啟動(dòng)GG,當(dāng)需要操作注冊(cè)表時(shí),再提升至管理員權(quán)限。后來(lái)通過(guò)查資料了解到: (1)無(wú)法單獨(dú)提升某個(gè)線程的運(yùn)行權(quán)限,運(yùn)行權(quán)限是與進(jìn)程綁定了。 (2)若要提升進(jìn)程的權(quán)限,必須在進(jìn)程啟動(dòng)時(shí)就設(shè)定。 這意味著要實(shí)現(xiàn)我的方案,必須在GG設(shè)置或取消開(kāi)機(jī)啟動(dòng)時(shí),重啟GG進(jìn)程。這也太不優(yōu)雅了。繼續(xù)想辦法,最后讓我想到了一個(gè)巧妙的方案。思路如下: (1)將GG中設(shè)置或取消開(kāi)機(jī)啟動(dòng)的功能(即需要管理員權(quán)限的部分),做成一個(gè)單獨(dú)的控制臺(tái)程序AutoStart.exe,并且將其運(yùn)行權(quán)限配置為管理員。 (2)將AutoStart.exe放到與GG.exe的運(yùn)行目錄。 (3)GG實(shí)現(xiàn)開(kāi)機(jī)啟動(dòng)功能的方法就是啟動(dòng)AutoStart.exe進(jìn)程,并通過(guò)啟動(dòng)參數(shù)來(lái)傳遞相關(guān)信息給AutoStart.exe進(jìn)程。 二.方案實(shí)現(xiàn)1.AutoStart.exe AutoStart.exe是一個(gè)控制臺(tái)程序,我將其實(shí)現(xiàn)為一個(gè)可復(fù)用的應(yīng)用程序,大家可以直接從文末下載復(fù)用。其源碼相當(dāng)簡(jiǎn)單,如下所示: /// <summary> /// 第一個(gè)參數(shù)為exe的名稱,第二個(gè)參數(shù)為bool值,表示是否自動(dòng)啟動(dòng) /// </summary> static void Main(string[] args) { try { bool autoStart = bool.Parse(args[1]); Console.WriteLine(string.Format("正在{0}自動(dòng)啟動(dòng) {1} . . .", autoStart ? "設(shè)置" : "取消" ,args[0]) ); //操作注冊(cè)表,需要使用管理員身份啟動(dòng)程序。 RunWhenStart_usingReg(autoStart, args[0], AppDomain.CurrentDomain.BaseDirectory + args[0]); Console.WriteLine(""); Console.WriteLine("操作完成! 按任意鍵退出 . . ."); Console.ReadLine(); } catch(Exception ee) { Console.WriteLine("操作時(shí)發(fā)生異常:" + ee.Message + " 按任意鍵退出 . . ."); Console.ReadLine(); } } #region 開(kāi)機(jī)自動(dòng)啟動(dòng) /// <summary> /// 開(kāi)機(jī)自動(dòng)啟動(dòng),使用注冊(cè)表 /// </summary> /// <param name=\"Started\">是否開(kāi)機(jī)自動(dòng)啟動(dòng)</param> /// <param name=\"name\">取一個(gè)唯一的注冊(cè)表Key名稱</param> /// <param name=\"path\">啟動(dòng)程序的完整路徑</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配置為以管理員身份啟動(dòng),可以參考這篇文章。 2.在GG中調(diào)用AutoStart.exe 當(dāng)用戶都選上或去掉勾選"開(kāi)機(jī)自動(dòng)啟動(dòng)"時(shí),程序執(zhí)行如下操作: if (autoStartChanged) { string args = string.Format("{0} {1}", "GG.exe", autoStart? "true":"false"); Process.Start(AppDomain.CurrentDomain.BaseDirectory + "AutoStart.exe", args); } 運(yùn)行效果截圖: 三.下載
PS:QQ的自動(dòng)啟動(dòng)是怎么實(shí)現(xiàn)的了?它似乎不需要管理員權(quán)限,有知道的朋友拜托留言告訴一下啊,謝謝! 該文章在 2017/2/7 17:59:55 編輯過(guò) |
關(guān)鍵字查詢
相關(guān)文章
正在查詢... |