天天看點

制作 開機右下角資訊彈出框

          最近客戶提出這樣的一個需求,就是希望可以像QQ新聞一樣彈出一個提示框來提醒自己進行網上訂餐。

          剛拿到這個需求的時候,感覺應該挺好做的,其實主要的難題也就有兩個:

                  1、制作彈出窗體。

                  2、實作開機自動啟動。

在做之前,自己分析了一下:

由于實作開機自動啟動這個挺簡單的,以前的時候也實作過樣的功能,是以不是主要難題(中途遇到一個問題,着實讓自己頭痛了半天啊!)。

          那麼,怎麼樣實作制作彈出窗體呢?

  我是這樣實作的,利用了一個API函數:

  引入命名空間:

using System.Runtime.InteropServices;   //引入命名空間
           

聲明API:

//API原型
        [DllImport("user32.dll")]
        private static extern bool AnimateWindow(IntPtr hwnd, int dateTime, int dwFlags);//hwnd視窗句柄.dateTime:動畫時長.dwFlags:動畫類型組合

        int AW_ACTIVE = 0x20000; //激活視窗,在使用了AW_HIDE标志後不要使用這個标志
        int AW_HIDE = 0x10000;//隐藏視窗
        int AW_BLEND = 0x80000;// 使用淡入淡出效果
        int AW_SLIDE = 0x40000;//使用滑動類型動畫效果,預設為滾動動畫類型,當使用AW_CENTER标志時,這個标志就被忽略
        int AW_CENTER = 0x0010;//若使用了AW_HIDE标志,則使視窗向内重疊;否則向外擴充
        int AW_HOR_POSITIVE = 0x0001;//自左向右顯示視窗,該标志可以在滾動動畫和滑動動畫中使用。使用AW_CENTER标志時忽略該标志
        int AW_HOR_NEGATIVE = 0x0002;//自右向左顯示視窗,該标志可以在滾動動畫和滑動動畫中使用。使用AW_CENTER标志時忽略該标志
        int AW_VER_POSITIVE = 0x0004;//自頂向下顯示視窗,該标志可以在滾動動畫和滑動動畫中使用。使用AW_CENTER标志時忽略該标志
        int AW_VER_NEGATIVE = 0x0008;//自下向上顯示視窗,該标志可以在滾動動畫和滑動動畫中使用。使用AW_CENTER标志時忽略該标志

        private int currentX;//橫坐标   
        private int currentY;//縱坐标   
        private int screenHeight;//螢幕高度   
        private int screenWidth;//螢幕寬度 
           

在窗體加載事件裡添加如下代碼:

Rectangle rect = Screen.PrimaryScreen.WorkingArea;
            screenHeight = rect.Height;
            screenWidth = rect.Width;
            currentX = screenWidth - this.Width;
            currentY = screenHeight - this.Height;
            this.Location = new System.Drawing.Point(currentX, currentY);

            AnimateWindow(this.Handle, 1000, AW_SLIDE | AW_VER_NEGATIVE);
           

這樣就實作了彈出窗體的效果,接下來,是制作開機啟動,我把這個功能放在了程式第一次運作中(這樣做的一個好處是,如果客戶取消這個程式的開機自動啟動,那麼下次啟動的時候,又會添加到開機啟動項中去)。也就是在from的窗體加載事件裡

             關鍵函數如下:

private bool runWhenStart(bool started, string exeName, string path)
        {
            RegistryKey key = Registry.LocalMachine.OpenSubKey("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run", RegistryKeyPermissionCheck.ReadWriteSubTree, System.Security.AccessControl.RegistryRights.ReadKey);     //打開系統資料庫子項
            if (key == null)//如果該項不存在的話,則建立該子項
            {
                
                key = Registry.LocalMachine.CreateSubKey("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run");
            }
            if (started == true)
            {
                try
                {
                    key=Registry.LocalMachine.OpenSubKey("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run",true);
                    key.SetValue(exeName, path);//設定為開機啟動
                    key.Close();
                }
                catch
                {
                    return false;
                }
            }
            else
            {
                try
                {
                    key.DeleteValue(exeName);//取消開機啟動
                    key.Close();
                }
                catch
                {
                    return false;
                }
            }
            return true;
        }
           

然後在彈出窗體的代碼下添加:

//第一次運作後,開機自動啟動
            string str = this.GetType().Assembly.Location;
            string exeName = str.Substring(str.LastIndexOf("\\") + 1);
            runWhenStart(true, exeName, str);
           

總結:在這個過程中,我遇到一個這樣的問題,就是關于讀取系統資料庫權限的問題,如圖:

制作 開機右下角資訊彈出框

      關于這個問題的解決方法,可以參考我的源碼。

3、接下來還有一個問題,就是怎麼樣在安裝結束後,程式自動行動呢?

那就需要在制作安裝項目的時候添加自定義操作了:

這個挺簡單的,可以參考MSDN的幫助,給一個連結:

http://msdn.microsoft.com/zh-cn/library/bbd7cck3(v=vs.100)

繼續閱讀