代码改变世界

如何监控你的鼠标

2013-05-17 09:21  轩脉刃  阅读(5086)  评论(16编辑  收藏  举报

你想知道你每天的鼠标左键和右键的点击次数吗?你想知道你的鼠标手是怎么养成的吗?源于上面的两个想法,就开发了MouseMonitor这款应用。它是用来记录每天工作的时候鼠标左键和鼠标右键的点击次数。这是款很小的软件,源代码也已经开源了。欢迎到

http://mousemonitor.funaio.com/ 

下载使用。

MouseMonitor v1.0.1

首页:

Image

功能:

1 可以最小化到托盘。这样在工作的时候可不影响用户的使用。

2 可以进行一周的左右键点击次数的统计。这样可以对比看出每周的鼠标点击趋势。

Image(1)

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微博的分享按钮?)