写论文头大,翻资料找到一个以前写的小东西。有段时间在实验室,一坐就是一整天,经常在网上找找资料,找着找着就从一个链接点到另一链接,从豆瓣到Hoop,再弹出个QQ,一整个上午就过去了。天天对这显示器,于是就想我整天呆在这大部分时间在干什么了,要是有个记录就好了。就想写这么一个小程序,来记录我一天在电脑前花的时间分布。
怎么实现呢。要知道现在在干什么,就应该要知道我现在在活动程序,编辑或者鼠标点击的。如何知道现在活动的程序名,如果能获得当前活动的程序的可执行文件的路径就比较好办了。于是在网上找了找,在Windows下可以这样实现。
CString getProcPath(int PID)//返回pid进程的可执行程序名称 { HANDLE hModule; MODULEENTRY32* minfo=new MODULEENTRY32; minfo->dwSize=sizeof(MODULEENTRY32); hModule=CreateToolhelp32Snapshot(TH32CS_SNAPMODULE,PID);//对系统进程进行拍照 Module32First(hModule, minfo);//返回与进程相关的第一个模块信息 CString str; str=CString(minfo->szExePath); CloseHandle(hModule); if(minfo) delete minfo; return str; }得到了当前活动的程序名称就比较好办了,其实经常用的就是那么几个程序,稍加分析然后分类就能统计到我的时间分布。我这里分为了四类:编程、上网、看文档、QQ。用个定时器记录下来即可。实现个托盘最小化,就可以了。
void Report::Init() { m_Programming.push_back(_T("devenv.exe")); m_Programming.push_back(_T("Microsoft Visual Studio")); m_Programming.push_back(_T("vim")); m_Programming.push_back(_T("matlab")); m_Programming.push_back(_T("MATLAB")); m_OnWeb.push_back(_T("firefox")); m_OnWeb.push_back(_T("Chrome")); m_OnWeb.push_back(_T("IEXPLORE")); m_OnWeb.push_back(_T("opera")); m_QQ.push_back(_T("QQ")); m_QQ.push_back(_T("Tecent")); m_Document.push_back(_T("WINWORD")); m_Document.push_back(_T("Office")); m_Document.push_back(_T("CAJView")); m_Document.push_back(_T("hh.exe")); m_Document.push_back(_T("FOXITR")); }