你想知道你每天的鼠標左鍵和右鍵的點擊次數嗎?你想知道你的鼠標手是怎么養成的嗎?源於上面的兩個想法,就開發了MouseMonitor這款應用。它是用來記錄每天工作的時候鼠標左鍵和鼠標右鍵的點擊次數。這是款很小的軟件,源代碼也已經開源了。歡迎到
http://mousemonitor.funaio.com/
下載使用。
MouseMonitor v1.0.1
首頁:
功能:
1 可以最小化到托盤。這樣在工作的時候可不影響用戶的使用。
2 可以進行一周的左右鍵點擊次數的統計。這樣可以對比看出每周的鼠標點擊趨勢。
3 有升級提醒。當版本升級的話,會進行版本升級提醒。
mouseMonitor實現細節
源代碼已經開源:
https://github.com/jianfengye/MouseMonitor
在具體實現過程中主要用到了幾個技術:
1 C#中如何使用Windows Hook
在windows的事件中加入一個鈎子,當鼠標左鍵或者右鍵有動作的時候,觸發鈎子做一些對應的操作。
關於windows Hook的具體使用,之前有一篇文章介紹了Hook接口:
http://www.cnblogs.com/yjf512/archive/2013/05/13/3075179.html
也可以直接看mouseMonitor的例子:
https://github.com/jianfengye/MouseMonitor/blob/master/code/MouseMonitor/WinApi.cs
2 必須要多線程操作
這個程序需要將每天的鼠標點擊記錄進行持久化。我這里持久化選擇的是保存在本地文件(%Appdata%/mouseMonitor/log.xml)。但是由於windows鈎子是觸發在實際的事件之前的,所以在鈎子中做寫文件操作是不妥當的,會直接影響用戶的使用性能,用戶會感受的明顯的鼠標點擊受影響。所以我這邊是另外單獨啟動一個線程,來異步做寫文件操作(現在是每20秒進行一次寫操作)。
但是這里有個問題,如何在頁面上讓用戶感知出來這個軟件是有效的?這里就需要在頁面上有個計數器。這個計數器當然是保存在內存中的,所以每次鈎子觸發的時候,軟件就只要將這個計數器計數自增,這樣不會對用戶的實際使用不會有任何影響。然后再由異步線程來每20秒進行一次持久化操作。
3 統計如何顯示
我這里的統計圖表選擇使用form內嵌html頁面的方式。即在windows form中開一個webbrowser框,然后對mouseMonitor.funaio.com/show/static這個頁面進行POST操作,並且這個POST操作是帶附件的。然后在webbrowser中顯示出頁面展現出來的統計圖表。
這個統計頁面的服務端是使用php+nginx, 頁面使用的是open-flash-chart這個swf來渲染的。
關於open-flash-chart的使用可以參考這里:
http://www.cnblogs.com/yjf512/archive/2012/02/17/2355163.html
http://www.cnblogs.com/yjf512/archive/2012/02/14/2351716.html
這里我要吐槽下,之前是想要使用bootstrap的Chart.js(http://www.bootcss.com/p/chart.js/)來做的。
但是這里的Chart.js使用到了canvas標簽,而.net 4.0的windows Form使用的瀏覽器內核大概等同於IE8。所以是不支持html5的canvas的(我即使加上了一些輔助的js也是沒有用)。所以說html5的路還有很長啊...
4 保存的log文件放在哪里
原先是想當然的放在了exe所在的同級目錄。后來當打包的時候發現一個問題。一般安裝包安裝的默認路徑是C:\Programe File\mouseMonitor\ 下,而對於系統盤一般程序是沒有寫權限的,除非你使用管理員賬號運行程序。這個對用戶體驗又是個打擊。后來才知道,要寫入的數據最好放在%Appdata% 目錄下。這個目錄是允許一般的用戶進行寫入操作的。
如何獲取%Appdata%:
System.Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData)
5 如何在webBrowser控件中帶入附件?
這個其實是HTTP POST的問題,需要拼對body和header,照搬過網上的例子,發現有的是不行的。需要進行修改,后來就開個fiddler一點點抓包調試,現在這個函數是可以直接使用的了。
對應的代碼可以看這個文件:
https://github.com/jianfengye/MouseMonitor/blob/master/code/MouseMonitor/ShowForm.cs
6 一些代碼的問題:
1 如何將Directory結構xml序列化?
另外創建了SerializableDictionary 的類,需要繼承Dictionary<String, MouseState>, IXmlSerializable
具體代碼:
https://github.com/jianfengye/MouseMonitor/blob/master/code/MouseMonitor/SerializableDictionary.cs
2 應用升級如何通知用戶?
服務器開發一個升級接口,服務器返回最新版本號,和代碼中寫死的版本號比對。
3 子線程如何暫停和恢復?
thread.Suspend()
thread.Resume()
后記
本來的想法是做個小玩意自己使用。后來發現如果以產品的視角來做的話,技術核心功能完成之后,其他周邊的非核心功能或許需要的時間更多。所以再感慨下,做一個給自己使用的應用和做一個想能給別人使用的應用是兩個概念。
比如這個應用,實際上還是沒有UI的,后續還可以做的事情可能有:
美化UI(外表啊外表。。。)
增加功能(當前只能記錄鼠標左鍵和右鍵,或許還可以實現更炫的功能?)
應用統計(每天下載量多少?或許這個軟件實際上不會有人用,但是數據還是需要后台統計才能知道)
軟件自升級(現在只是有個升級提示,讓用戶去網站下載,這個用戶體驗還是很不好的。如果能用戶同意升級后點擊一個按鈕就自動下載升級就好了)
是否可以發送統計圖表到社交網站?(比如在統計頁面上增加sina微博的分享按鈕?)