上方廣告

2013年5月9日 星期四

Application閒置過久關閉

好久沒有寫網誌了,感覺這裡都快要生蜘蛛網了,今天朋友問了如何判斷一個WindowsForm表單閒置過一定的時間後,自動關閉程式,原本想說使用Form MouseMove & Form Click兩個Event加上Timer來判斷,時間到了自動關閉,但後來確發現要是Form上面有一個很大的Component占據了Form的頁面,這時候Form的Event將抓取不到。

後來發現Application本身有提供一個Event Idle,Idle本身在表單停止任何動作的時候會進入一次,如此一來就可以搭配Timer來處理關閉程式的動作了,相關程式碼如下,不過這裡還有一個地方需要注意,Timer在執行的過程中並不算系統Idle,因此我下面的代碼做了點手腳,在Timer檢查的時候判斷的時間點要比Idle的時間點還要早100毫秒,這樣就可以巧妙的通過檢查了。
Timer timer = new Timer();
int lastidleTime = 0; //最後閒置時間
int checkTime = 2000; //檢查秒數

void timer_Tick(object sender, EventArgs e)
{
    if (Environment.TickCount - lastidleTime > checkTime - 100) //Timer在執行的時候不算idle,所以扣一點時間
    {
        timer.Enabled = false;
        Application.Exit();
    }
}

void Application_Idle(object sender, EventArgs e)
{
    //設定最後時間
    lastidleTime = Environment.TickCount;
}

private void Form_Main_Load(object sender, EventArgs e)
{
    Application.Idle += new EventHandler(Application_Idle);
    lastidleTime = Environment.TickCount;
    timer.Interval = checkTime; //每秒鐘檢查
    timer.Tick += new EventHandler(timer_Tick);
    timer.Enabled = true;
}

還有一小點必須注意,如果Application.Idle EventHandler是使用靜態宣告的話,記得結束程式的時候要處理一下。