Update@2005.8.19
TimeDog最新版本 v13
http://www2.zzu.edu.cn/xb/timedog.exe
原始碼這裡下載
http://www2.zzu.edu.cn/xb/timedog_src.rar
==============
本人以前做過不少的ASP.NET的web應用程式開發,但是,在傳統型應用程式開發方面不熟悉,基本沒有開發過這方面的軟體,如今,本人想通過共同開發來交流,利用業餘時間使自己具有開發應用軟體的經驗,希望C#初學者,或者已經掌握C# Windows應用程式開發的.net愛好者與我交流.QQ:154222225.
項目初步需求如下:
名稱:TimeDog
實現功能:能夠累計計算電腦從某時刻起,其啟動並執行總體時間.軟體隨作業系統啟動,並開始計時,使用者關閉作業系統時,儲存已耗用時間,以便和下次的已耗用時間進行累加.作業系統運行時期內,不允許使用者結束本軟體進程.
共同開發人員:
#caca(卡卡) http://www.cnblogs.com/caca
#frogman http://www.cnblogs.com/frogman/
開發進度如下:
1,在CSDN發表的求助:http://community.csdn.net/Expert/topic/3797/3797941.xml?temp=.8971979
2,自啟動解決方案:
使程式開機自動運行(修改註冊表?):
將你的程式加入“HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run”
//自動運行
RegistryKey hklm = Registry.LocalMachine ;
RegistryKey run = hklm.OpenSubKey ( @"SOFTWARE\Microsoft\Windows\CurrentVersion\Run" , true ) ;
if(run.GetValue( "LookOut") == null)
{
string eFileName=Application.ExecutablePath + " ";//含可執行檔名
run.SetValue ( "LookOut" , exeFileName );
}
run.Close();
hklm.Close();
3,關於.NET的Hooks
http://www.codeproject.com/csharp/GlobalSystemHook.asp
4,自啟動以及計時功能已經初步實現,考慮到微量資料的儲存,暫時直接儲存到註冊表內部. private void Form1_Load(object sender, System.EventArgs e)
{
//檢測登錄機碼是否已經設定了自動啟動
RegistryKey LM=Registry.LocalMachine;
RegistryKey run=LM.OpenSubKey(@"SOFTWARE\Microsoft\Windows\CurrentVersion\Run",true);
if(run.GetValue("TimeDog")==null)
{
string exeFileName=Application.StartupPath+@"\TimeDog.exe";
run.SetValue("TimeDog",exeFileName);
}
//設定登錄機碼,用來儲存系統已耗用時間
if(run.GetValue("TimeDogRunTime")==null)
{
run.SetValue("TimeDogRunTime","00:00:00");
}
//設定開始時間
run.SetValue("TimeDogStartTime",DateTime.Now.ToString());
//系統已耗用時間
MessageBox.Show("系統運行了:"+run.GetValue("TimeDogRunTime").ToString());
run.Close();
LM.Close();
}
private void Form1_Closing(object sender, System.ComponentModel.CancelEventArgs e)
{
//使用者關閉視窗時候,計算程式已耗用時間,並存入註冊表
RegistryKey LM=Registry.LocalMachine;
RegistryKey run=LM.OpenSubKey(@"SOFTWARE\Microsoft\Windows\CurrentVersion\Run",true);
TimeSpan LastAll=(TimeSpan)(Convert.ToDateTime(run.GetValue("TimeDogRunTime")).TimeOfDay);//獲得上次總體已耗用時間
DateTime TimeDogStartTime=Convert.ToDateTime(run.GetValue("TimeDogStartTime").ToString());//獲得本次開始已耗用時間
TimeSpan ts=DateTime.Now-TimeDogStartTime;//本次已耗用時間
TimeSpan AllTime=LastAll+ts;//本次在內的總體時間
if(run.GetValue("TimeDogRunTime")==null)
{
run.SetValue("TimeDogRunTime","0");
}
else
run.SetValue("TimeDogRunTime",AllTime.ToString());
}
5,實作類別似QQ最小化形式的功能,參考了:
C#編寫最小化時隱藏為工作列表徵圖的Window appllication.
6,禁止使用者點擊關閉按鈕時關閉應用程式.private void Form1_Closing(object sender, System.ComponentModel.CancelEventArgs e)
{
e.Cancle=true;
}
7,項目源檔案提供下載
8,關於Windows服務程式的設計
用Visual C#建立Windows服務程式
用C#建立Windows服務(Windows Services)
9,能建立一個"不死進程"的程式將更好,但是,CSDN的網友說了,無法實現進位使用者結束進程的,於是有人提議用進程注入,這些可能只能用彙編或者C實現了,C#應該不能實現,現在做出了Windows服務程式版本,22K的程式,而且知識在服務啟動,停止的時候作些檔案讀取操作,但是其佔用的記憶體(7.35M)著實不太讓我滿意,程式的最佳化又從何處著手呢?
Windows服務版本提供原始碼下載 (程式的安裝參考上面的兩篇文章)
10,Windows服務版本本來是禁止使用者停止服務的,在使用者關閉電腦的時候觸發一個事件並記錄時間,所以應該重寫OnShutdown()函數,而不是OnStop()函數 protected override void OnShutdown()
{
base.OnShutdown ();
WriteLog("end@"+DateTime.Now.ToString());
WriteLog("===========");
//記錄已耗用時間
WriteTime();
}
並且專門寫一個TimeDogSee的東西供使用者查看電腦共已耗用時間.
11,放兩個程式的圖片
(:程式以後台服務的形式運行,禁止停止服務)
(:程式的進程圖,20K的程式,佔用記憶體怎麼那麼多呢???C#寫的程式“很吃記憶體”,有沒有最佳化的方法呢?是不是因為後台服務程式調用了很多.net的程式集,雖然代碼就幾行--Microsoft簡化的程式的設計難度。)
(:程式運行一段時間後,佔用記憶體大幅度降低)
(:TimeDogSee,用來查看系統共啟動並執行時間)
12,下面的任務就是做成分布式的應用程式,我們一戶為了計時收費,全部安裝了本軟體,於是想通過網路編程,是使用者可以發送啟動並執行時間以及詳細記錄,伺服器也可以通過網路進行對用戶端的已耗用時間進行控制-比如:清零。
13,關於c#方面的網路編程的書籍,記得上個學期的暑假裡面看過一本書:
C# Network Programming |
by Richard Blum |
ISBN:0782141765 |
Sybex 2003 (647 pages) |
當時,還編寫了一個控制台下的區域網路聊天程式的,如今,打算再看看了.
裡面涉及到一個網路抓包工具:WinPcap(Ethereal也是調用他實現網路抓包的),可以在這裡下載:
http://netgroup-serv.polito.it/netgroup/tools.html
14,軟體啟動並執行很是成功,不過準備改進一下:
(1)加入定時計算結果,防止以外調電,或者使用者或者系統關閉進程(有記錄).
(2)儲存的資料進行加密,路徑更為隱蔽.
(3)對軟體進行部署,方便安裝,卸載與更新.