
#pragma once
#include <vector>
struct UseTime
{
// 开始时间
SYSTEMTIME startTime;
// 结束时间
SYSTEMTIME endTime;
// 时间差
SYSTEMTIME subTime;
};
struct UseSoftInfo
{
// 软件名
CString SoftName;
// 软件启动时间;如果在打开我们的软件之前,待监测软件已存在,默认启动时间为我们软件打开的时间
std::vector<UseTime> useTime;
// 累计使用时间
SYSTEMTIME allTime;
// 使用次数
unsigned int nCount;
// 状态
bool bStatus;
};
class SoftTime
{
public:
// 软件使用时间
std::vector<UseSoftInfo> m_SoftUseTime;
private:
// 定时器处理函数
static void CALLBACK TimerProc(HWND hWnd,UINT nMsg,UINT nTimerid,DWORD dwTime);
// 提权
BOOL EnableDebugPrivilege (BOOL fEnable);
// 计算时间差
SYSTEMTIME SubTime (SYSTEMTIME t1, SYSTEMTIME t2);
// 计算累计时间
SYSTEMTIME AddTime (SYSTEMTIME t1, SYSTEMTIME t2);
// 判断是否为系统进程
bool IsSystemProcess (LPCTSTR lpProName);
// 初始化时间为0
void InitTime (SYSTEMTIME& st);
public:
SoftTime();
~SoftTime();
public:
// 初始化进程信息
void InitProcessName (void);
};
</div>
#include "stdafx.h" // 如果编译出错请删除此行
#include "UseSoftTime.h"
#include "TlHelp32.h"
#include "StrSafe.h"
#include "Psapi.h"
// 防止错误 error LNK2019
#pragma comment(lib, "psapi.lib")
// 全局变量
SoftTime * g_pSoftTime = NULL;
SoftTime::SoftTime()
{
g_pSoftTime = this;
}
SoftTime::~SoftTime()
{
if (g_pSoftTime != NULL)
{
g_pSoftTime = NULL;
}
}
void CALLBACK SoftTime::TimerProc(HWND hWnd,UINT nMsg,UINT nTimerid,DWORD dwTime)
{
SoftTime * pSoftTimeInfo = (SoftTime*)g_pSoftTime;
// 当前系统普通进程的进程名称
std::vector<CString> currentProcessName;
HANDLE hProcessSnap = NULL;
HANDLE hProcessDll = NULL;
BOOL bRet = FALSE;
// 初始化dwSize为0,不然Process32First执行失败
PROCESSENTRY32 pe32 = {0};
MODULEENTRY32 me32;
LPVOID lpMsgBuf;
LPVOID lpDisplayBuf;
DWORD dwError;
LPCTSTR pszFormat = TEXT("开始服务时遇到错误! %s");
if(!pSoftTimeInfo->EnableDebugPrivilege(1))
{
MessageBox(NULL, _T("提权失败!"), _T("提示"), MB_OK|MB_ICONEXCLAMATION);
}
hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if (hProcessSnap == INVALID_HANDLE_VALUE)
{
dwError = GetLastError();
FormatMessage(
FORMAT_MESSAGE_ALLOCATE_BUFFER|
FORMAT_MESSAGE_FROM_SYSTEM|
FORMAT_MESSAGE_IGNORE_INSERTS,
NULL,
dwError,
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
LPTSTR(&lpMsgBuf),
0,
NULL);
lpDisplayBuf = (LPVOID)LocalAlloc(
LMEM_ZEROINIT,
(lstrlen((LPCTSTR)lpMsgBuf)+lstrlen(pszFormat))*sizeof(TCHAR));
// 格式化字符串
StringCchPrintf(
(LPTSTR)lpDisplayBuf,
LocalSize(lpDisplayBuf), // 字节数
pszFormat,
lpMsgBuf);
CString strTemp;
strTemp.Format(TEXT("错误编码为:%d"), dwError);
::MessageBox(NULL, (LPCTSTR)lpDisplayBuf, strTemp, MB_OK|MB_ICONEXCLAMATION);
// 清理分配的内存
LocalFree(lpMsgBuf);
LocalFree(lpDisplayBuf);
return;
}
pe32.dwSize = sizeof(PROCESSENTRY32);
Module32First(hProcessSnap, &me32);
if (Process32First(hProcessSnap, &pe32))
{
do
{
WCHAR path[MAX_PATH]={0};
HMODULE hModule;
HANDLE hProcess;
DWORD needed;
hProcess=OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, false, pe32.th32ProcessID);
if (hProcess)
{
// 枚举进程