程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> ASP.NET >> 關於ASP.NET >> 只運行一個實例且試圖運行第二個實例時自動激活第一個實例

只運行一個實例且試圖運行第二個實例時自動激活第一個實例

編輯:關於ASP.NET

本文配套源碼

很多程序象winamp,TTplayer,RealPlayer等都有自動激活前一個實例的功能,其實這玩意也很簡單的 ,在VB中可以用App.hInstance 來判斷是否運行了程序的一個實例,用API函數FindWindow來找到前一個 實例的句柄,從而為激活她做好了准備。但是App.hInstance 有很大的局限性,一個不需要其他資源支 持的EXE文件,如果你復制到其他目錄,這個復制品就可以暢通無阻的運行而不管他的前輩是否已運行, 如果這個程序需要獨占某個硬件或其他資源,這樣就會存在潛在的沖突,因此我們必須尋找其他可靠的 途徑來保證我們作品的排一無二性。

Windows中互斥體的概念使得上面的問題得以輕松解決。我 們在程序第一次運行得時候創建一個特定的互斥體,在第二次或者更多次運運行時程序在創建互斥體時 就會發生錯誤,我們捕捉到這個錯誤並加以適當得處理就得以保證程序運行得唯一性。

那如何激 活前一個實例呢,別著急,Windows的API函數就是豐富,我們只要有了程序的句柄(就相當於人們的身 份證一樣,系統會保證他的唯一性),就可以對他進行隨意的操作, ShowWindow,SetForeGround,SetActiveWindow等等。如何得到這個ID呢,FindWindow,不錯,很多人會 這麼說。的確,這是個方法,並且是個不錯的函數,但是她的程序標題的敏感性使得很多情況下我們必 須拋棄她。比如winmap她的標題會隨著播放歌曲的改變而變化。怎麼辦,不急,既然句柄是唯一的,我 們為何不在程序啟動後把她記錄在我們的硬盤上呢。

好了,前面的分析使得我們在理論上能夠實 現類似於winamp的效果了,那為何不添加點新東西:在我們激活第一個窗體時,我們讓她來回閃爍幾下 不是更能夠得到用戶的注意嗎?FlashWindow的效果,對,就是FlashWindow,仔細看看她的使用方法, 要配合一個定時器來使用,哎,實現這個小功能,還要用定時器,真是有點不劃算啊,並且在sub main 中如何使用定時器也值得一番研究。那有沒有簡單得方法,of course, 看看FlashWindowEx把,Ex擴展 的函數就是不一樣,她有一個結構參數可以指定閃爍的次數和每次閃爍的時間。COOL!

說了一堆 ,還的付諸於實踐,代碼,我要的是代碼,別急,就來了。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved