最近客戶提出這樣的一個需求,就是希望可以像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)