狠狠色丁香婷婷综合尤物/久久精品综合一区二区三区/中国有色金属学报/国产日韩欧美在线观看 - 国产一区二区三区四区五区tv

LOGO OA教程 ERP教程 模切知識交流 PMS教程 CRM教程 開發文檔 其他文檔  
 
網站管理員

巧妙地利用進程分離來設置程序開機自動啟動!(附源碼)

admin
2017年2月7日 17:59 本文熱度 6002

  在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);
    }
復制代碼

  運行效果截圖:

  

三.下載

1.AutoStart 可執行程序

2.AutoStart 源碼

 

PS:QQ的自動啟動是怎么實現的了?它似乎不需要管理員權限,有知道的朋友拜托留言告訴一下啊,謝謝! 


該文章在 2017/2/7 17:59:55 編輯過
關鍵字查詢
相關文章
正在查詢...
點晴ERP是一款針對中小制造業的專業生產管理軟件系統,系統成熟度和易用性得到了國內大量中小企業的青睞。
點晴PMS碼頭管理系統主要針對港口碼頭集裝箱與散貨日常運作、調度、堆場、車隊、財務費用、相關報表等業務管理,結合碼頭的業務特點,圍繞調度、堆場作業而開發的。集技術的先進性、管理的有效性于一體,是物流碼頭及其他港口類企業的高效ERP管理信息系統。
點晴WMS倉儲管理系統提供了貨物產品管理,銷售管理,采購管理,倉儲管理,倉庫管理,保質期管理,貨位管理,庫位管理,生產管理,WMS管理系統,標簽打印,條形碼,二維碼管理,批號管理軟件。
點晴免費OA是一款軟件和通用服務都免費,不限功能、不限時間、不限用戶的免費OA協同辦公管理系統。
Copyright 2010-2025 ClickSun All Rights Reserved