最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++統(tǒng)計(jì)軟件使用時(shí)間代碼示例

 更新時(shí)間:2013年11月24日 10:21:34   作者:  
這篇文章主要介紹了C++統(tǒng)計(jì)軟件使用時(shí)間的小程序,大家可以參考使用


復(fù)制代碼 代碼如下:

// FileName: UseSoftTime.h

#pragma once

#include <vector>

struct UseTime
{
    // 開始時(shí)間
    SYSTEMTIME startTime;

    // 結(jié)束時(shí)間
    SYSTEMTIME endTime;

    // 時(shí)間差
    SYSTEMTIME subTime;
};

struct UseSoftInfo
{
    // 軟件名
    CString SoftName;

    // 軟件啟動(dòng)時(shí)間;如果在打開我們的軟件之前,待監(jiān)測(cè)軟件已存在,默認(rèn)啟動(dòng)時(shí)間為我們軟件打開的時(shí)間
    std::vector<UseTime> useTime;

    // 累計(jì)使用時(shí)間
    SYSTEMTIME allTime;

    // 使用次數(shù)
    unsigned int nCount;

    // 狀態(tài)
    bool bStatus;
};

class SoftTime
{
public:

    // 軟件使用時(shí)間
    std::vector<UseSoftInfo> m_SoftUseTime;

private:

    // 定時(shí)器處理函數(shù)
    static void CALLBACK TimerProc(HWND hWnd,UINT nMsg,UINT nTimerid,DWORD dwTime);

    // 提權(quán)
    BOOL EnableDebugPrivilege (BOOL fEnable);

    // 計(jì)算時(shí)間差
    SYSTEMTIME SubTime (SYSTEMTIME t1, SYSTEMTIME t2);

    // 計(jì)算累計(jì)時(shí)間
    SYSTEMTIME AddTime (SYSTEMTIME t1, SYSTEMTIME t2);

    // 判斷是否為系統(tǒng)進(jìn)程
    bool IsSystemProcess (LPCTSTR lpProName);

    // 初始化時(shí)間為0
    void InitTime (SYSTEMTIME& st);

public:
    SoftTime();
    ~SoftTime();

public:

    // 初始化進(jìn)程信息
    void InitProcessName (void);
};

復(fù)制代碼 代碼如下:

// FileName: UseSoftTime.cpp

#include "stdafx.h"                    // 如果編譯出錯(cuò)請(qǐng)刪除此行
#include "UseSoftTime.h"

#include "TlHelp32.h"
#include "StrSafe.h"
#include "Psapi.h"
// 防止錯(cuò)誤 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;

    // 當(dāng)前系統(tǒng)普通進(jìn)程的進(jìn)程名稱
    std::vector<CString> currentProcessName;

    HANDLE hProcessSnap = NULL;
    HANDLE hProcessDll = NULL;
    BOOL bRet = FALSE;

    // 初始化dwSize為0,不然Process32First執(zhí)行失敗
    PROCESSENTRY32 pe32 = {0};
    MODULEENTRY32 me32;
    LPVOID lpMsgBuf;
    LPVOID lpDisplayBuf;
    DWORD dwError;

    LPCTSTR pszFormat = TEXT("開始服務(wù)時(shí)遇到錯(cuò)誤! %s");

    if(!pSoftTimeInfo->EnableDebugPrivilege(1))
    {
        MessageBox(NULL, _T("提權(quán)失?。?), _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),            // 字節(jié)數(shù)
            pszFormat,
            lpMsgBuf);

        CString strTemp;
        strTemp.Format(TEXT("錯(cuò)誤編碼為:%d"), dwError);
        ::MessageBox(NULL, (LPCTSTR)lpDisplayBuf, strTemp, MB_OK|MB_ICONEXCLAMATION);
        // 清理分配的內(nèi)存
        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)
            {
                // 枚舉進(jìn)程
                EnumProcessModules(hProcess, &hModule, sizeof(hModule), &needed);

                // 獲取進(jìn)程的全路徑
                memset(path, 0, sizeof(WCHAR)*MAX_PATH);
                GetModuleFileNameEx(hProcess, hModule, path, sizeof(WCHAR)*MAX_PATH);

                if (!(pSoftTimeInfo->IsSystemProcess(path)))
                {
                    std::vector<CString>::iterator iter;
                    bool bIsExist = false;
                    for (iter=currentProcessName.begin(); iter!=currentProcessName.end(); iter++)
                    {
                        if (*iter ==pe32.szExeFile)
                        {
                            bIsExist = true;
                        }
                    }

                    if (!bIsExist)
                    {
                        currentProcessName.push_back(pe32.szExeFile);
                    }
                }
            }
        }
        while (Process32Next(hProcessSnap, &pe32));
    }

    // 查找已存在的進(jìn)程
    std::vector<UseSoftInfo>::iterator iter1;
    std::vector<CString >::iterator iter2;


    for (iter2=currentProcessName.begin(); iter2!=currentProcessName.end(); iter2++)
    {
        bool bIsExist = false;
        int nIndex = 0;
        for (iter1=pSoftTimeInfo->m_SoftUseTime.begin(); iter1!=pSoftTimeInfo->m_SoftUseTime.end(); iter1++, nIndex++)
        {
            // 已存在的進(jìn)程,更新軟件使用時(shí)間
            if (*iter2 == iter1->SoftName)
            {
                // 進(jìn)程已存在;
                bIsExist = true;

                if (iter1->bStatus)
                {
                    SYSTEMTIME st;
                    GetLocalTime(&st);

                    int n = pSoftTimeInfo->m_SoftUseTime[nIndex].nCount - 1;
                    //pSoftTimeInfo->m_SoftUseTime[nIndex].allTime = pSoftTimeInfo->SubTime(pSoftTimeInfo->m_SoftUseTime[nIndex].useTime[n].startTime, st);
                    pSoftTimeInfo->m_SoftUseTime[nIndex].useTime[n].subTime = pSoftTimeInfo->SubTime(pSoftTimeInfo->m_SoftUseTime[nIndex].useTime[n].startTime, st);

                    std::vector<UseTime>::iterator iter;
                    pSoftTimeInfo->InitTime(st);
                    for (iter=pSoftTimeInfo->m_SoftUseTime[nIndex].useTime.begin(); iter!=pSoftTimeInfo->m_SoftUseTime[nIndex].useTime.end(); iter++)
                    {
                        st = pSoftTimeInfo->AddTime(st, iter->subTime);
                    }
                    pSoftTimeInfo->m_SoftUseTime[nIndex].allTime = st;
                }
                else   // 第二次以后打開的情況
                {
                    pSoftTimeInfo->m_SoftUseTime[nIndex].nCount += 1;
                    pSoftTimeInfo->m_SoftUseTime[nIndex].bStatus = true;

                    UseTime useTime;
                    GetLocalTime(&useTime.startTime);
                    pSoftTimeInfo->InitTime(useTime.endTime);
                    pSoftTimeInfo->InitTime(useTime.subTime);
                    pSoftTimeInfo->m_SoftUseTime[nIndex].useTime.push_back(useTime);
                }
            }

        }

        // 新添加的進(jìn)程
        if (!bIsExist)
        {
            UseSoftInfo infoTemp;
            UseTime useTime;

            GetLocalTime(&useTime.startTime);
            pSoftTimeInfo->InitTime(useTime.endTime);
            pSoftTimeInfo->InitTime(useTime.subTime);
            infoTemp.useTime.push_back(useTime);

            infoTemp.SoftName = pe32.szExeFile;
            pSoftTimeInfo->InitTime(infoTemp.allTime);

            infoTemp.nCount = 1;
            infoTemp.bStatus = true;

            pSoftTimeInfo->m_SoftUseTime.push_back(infoTemp);
        }
    }

    // 查找退出的進(jìn)程
    int nIndex = 0;
    for (iter1=pSoftTimeInfo->m_SoftUseTime.begin(); iter1!=pSoftTimeInfo->m_SoftUseTime.end(); iter1++, nIndex++)
    {
        bool bIsExist = false;
        for (iter2=currentProcessName.begin(); iter2!=currentProcessName.end(); iter2++)
        {
            if (iter1->SoftName == *iter2)
            {
                bIsExist = true;
            }
        }

        // 退出的進(jìn)程
        if (!bIsExist && pSoftTimeInfo->m_SoftUseTime[nIndex].bStatus)
        {
            SYSTEMTIME st;
            GetLocalTime(&st);
            pSoftTimeInfo->m_SoftUseTime[nIndex].useTime[pSoftTimeInfo->m_SoftUseTime[nIndex].nCount-1].endTime = st;
            pSoftTimeInfo->m_SoftUseTime[nIndex].useTime[pSoftTimeInfo->m_SoftUseTime[nIndex].nCount-1].subTime = \
                pSoftTimeInfo->SubTime(pSoftTimeInfo->m_SoftUseTime[nIndex].useTime[pSoftTimeInfo->m_SoftUseTime[nIndex].nCount-1].startTime, st);

            std::vector<UseTime>::iterator iter;
            pSoftTimeInfo->InitTime(st);
            for (iter=pSoftTimeInfo->m_SoftUseTime[nIndex].useTime.begin(); iter!=pSoftTimeInfo->m_SoftUseTime[nIndex].useTime.end(); iter++)
            {
                st = pSoftTimeInfo->AddTime(st, iter->subTime);
            }

            //pSoftTimeInfo->m_SoftUseTime[nIndex].allTime = st;
            pSoftTimeInfo->m_SoftUseTime[nIndex].bStatus = false;
        }
    }

 

    // 關(guān)閉特權(quán)
    pSoftTimeInfo->EnableDebugPrivilege(0);
    // 關(guān)閉內(nèi)核對(duì)象
    CloseHandle(hProcessSnap );

}

BOOL SoftTime::EnableDebugPrivilege (BOOL fEnable)
{
    BOOL fOk = FALSE;  
    HANDLE hToken;

    // 得到進(jìn)程的訪問(wèn)令牌
    if (OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES,&hToken))
    {   
        TOKEN_PRIVILEGES tp;
        tp.PrivilegeCount = 1;
        // 查看系統(tǒng)特權(quán)值并返回一個(gè)LUID結(jié)構(gòu)體
        LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &tp.Privileges[0].Luid);
        tp.Privileges[0].Attributes = fEnable ? SE_PRIVILEGE_ENABLED : 0;
        // 啟用/關(guān)閉 特權(quán)
        AdjustTokenPrivileges(hToken, FALSE, &tp, sizeof(tp), NULL, NULL);
        fOk = (GetLastError() == ERROR_SUCCESS);
        CloseHandle(hToken);
    }
    else
    {
        return 0;
    }
    return(fOk);
}

void SoftTime::InitProcessName (void)
{
    HANDLE hProcessSnap = NULL;
    HANDLE hProcessDll = NULL;
    BOOL bRet = FALSE;

    // 初始化dwSize為0,不然Process32First執(zhí)行失敗
    PROCESSENTRY32 pe32 = {0};
    MODULEENTRY32 me32;
    LPVOID lpMsgBuf;
    LPVOID lpDisplayBuf;
    DWORD dwError;

    LPCTSTR pszFormat = TEXT("開始服務(wù)時(shí)遇到錯(cuò)誤! %s");

    if(!EnableDebugPrivilege(1))
    {
        MessageBox(NULL, _T("提權(quán)失?。?), _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),            // 字節(jié)數(shù)
            pszFormat,
            lpMsgBuf);

        CString strTemp;
        strTemp.Format(TEXT("錯(cuò)誤編碼為:%d"), dwError);
        ::MessageBox(NULL, (LPCTSTR)lpDisplayBuf, strTemp, MB_OK|MB_ICONEXCLAMATION);
        // 清理分配的內(nèi)存
        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)
            {
                // 枚舉進(jìn)程
                EnumProcessModules(hProcess, &hModule, sizeof(hModule), &needed);
                // 獲取進(jìn)程的全路徑

                memset(path, 0, sizeof(WCHAR)*MAX_PATH);
                GetModuleFileNameEx(hProcess, hModule, path, sizeof(WCHAR)*MAX_PATH);

                // 普通進(jìn)程
                if (!IsSystemProcess(path))
                {
                    UseSoftInfo infoTemp;
                    UseTime useTime;

                    GetLocalTime(&useTime.startTime);
                    InitTime(useTime.endTime);
                    InitTime(useTime.subTime);
                    infoTemp.useTime.push_back(useTime);

                    infoTemp.SoftName = pe32.szExeFile;

                    std::vector<UseSoftInfo>::iterator iter;
                    bool IsExist = false;
                    for (iter=m_SoftUseTime.begin(); iter!=m_SoftUseTime.end(); iter++)
                    {
                        if (iter->SoftName == infoTemp.SoftName)
                        {
                            IsExist = true;
                        }
                    }

                    if (!IsExist)
                    {
                        InitTime(infoTemp.allTime);
                        infoTemp.nCount = 1;
                        infoTemp.bStatus = true;

                        m_SoftUseTime.push_back(infoTemp);
                    }

                }

            }
        }
        while (Process32Next(hProcessSnap, &pe32));
    }

    // 關(guān)閉特權(quán)
    EnableDebugPrivilege(0);
    // 關(guān)閉內(nèi)核對(duì)象
    CloseHandle(hProcessSnap );

    // 設(shè)置一個(gè)定時(shí)器
    ::SetTimer(NULL, 1, 1000, TimerProc);
}

bool SoftTime::IsSystemProcess (LPCTSTR lpProName)
{
    CString strTemp(lpProName);
    strTemp.MakeLower();

    if (strTemp.Find(_T("windows")) != -1)
    {
        return true;
    }
    else if (strTemp == _T(""))
    {
        return true;
    }
    else if (strTemp.Find(_T("system32")) != -1)
    {
        return true;
    }
    else
    {
        return false;
    }
}

SYSTEMTIME SoftTime::SubTime (SYSTEMTIME t1, SYSTEMTIME t2)
{
    t2.wYear -= t1.wYear;
    t2.wMonth -= t1.wMonth;


    t2.wDay -= t1.wDay;

    if (t2.wHour >= t1.wHour)
    {
        t2.wHour -= t1.wHour;
    }
    else
    {
        t2.wDay -= 1;
        t2.wHour = 24 - t1.wHour + t2.wHour;
    }

    if (t2.wMinute >= t1.wMinute)
    {
        t2.wMinute -= t1.wMinute;
    }
    else
    {
        t2.wHour -= 1;
        t2.wMinute = 60 - t1.wMinute + t2.wMinute;
    }

    if (t2.wSecond >= t1.wSecond)
    {
        t2.wSecond -= t1.wSecond;
    }
    else
    {
        t2.wMinute -= 1;
        t2.wSecond = 60 - t1.wSecond + t2.wSecond;
    }

    return t2;
}

void SoftTime::InitTime (SYSTEMTIME& st)
{
    st.wYear = 0;
    st.wMonth = 0;
    st.wDay = 0;
    st.wHour = 0;
    st.wMinute = 0;
    st.wSecond = 0;
}

SYSTEMTIME SoftTime::AddTime (SYSTEMTIME t1, SYSTEMTIME t2)
{
    t1.wSecond += t2.wSecond;
    if (t1.wSecond >= 60)
    {
        t1.wSecond -= 60;
        t1.wMinute += 1;
    }

    t1.wMinute += t2.wMinute;
    if (t1.wMinute > 60)
    {
        t1.wMinute -= 60;
        t1.wHour += 1;
    }

    t1.wHour += t2.wHour;

    return t1;
}

相關(guān)文章

  • Qt實(shí)現(xiàn)對(duì)齊線功能的示例代碼

    Qt實(shí)現(xiàn)對(duì)齊線功能的示例代碼

    這篇文章主要介紹了Qt如何實(shí)現(xiàn)對(duì)齊線功能,并且可以添加任意數(shù)量和自動(dòng)吸附,文中示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2022-06-06
  • 詳解C++中的增量運(yùn)算符++和減量運(yùn)算符--的用法

    詳解C++中的增量運(yùn)算符++和減量運(yùn)算符--的用法

    這篇文章主要介紹了C++中的增量運(yùn)算符++和減量運(yùn)算符--的用法,分為前綴情況和后綴情況來(lái)講,需要的朋友可以參考下
    2016-01-01
  • C++聲明extern變量和extern函數(shù)的用法

    C++聲明extern變量和extern函數(shù)的用法

    extern關(guān)鍵字可以用來(lái)聲明變量和函數(shù)作為外部變量或者外部函數(shù)供其它文件使用,所以本文給大家介紹了C++聲明extern變量和extern函數(shù)的用法,文中有相關(guān)的代碼示例供大家參考,需要的朋友可以參考下
    2024-11-11
  • 基于C++實(shí)現(xiàn)的哈夫曼編碼解碼操作示例

    基于C++實(shí)現(xiàn)的哈夫曼編碼解碼操作示例

    這篇文章主要介紹了基于C++實(shí)現(xiàn)的哈夫曼編碼解碼操作,結(jié)合實(shí)例形式分析了C++實(shí)現(xiàn)的哈夫曼編碼解碼相關(guān)定義與使用技巧,需要的朋友可以參考下
    2018-04-04
  • C++string容器基本概念詳解

    C++string容器基本概念詳解

    c++相比c的一個(gè)好處就是實(shí)現(xiàn)了很多的容器和泛型算法,使得程序員的工作得到了很大的簡(jiǎn)化,本文重點(diǎn)給大家介紹C++string容器基本概念講解,需要的朋友參考下吧
    2021-07-07
  • 深入解析C++中的引用類型

    深入解析C++中的引用類型

    引用指的是對(duì)一個(gè)對(duì)象的引用。那么什么是對(duì)象?在c++中狹義的對(duì)象指的是用類,結(jié)構(gòu),聯(lián)合等復(fù)雜數(shù)據(jù)類型來(lái)聲明的變量,如 MyClass myclass,CDialog mydlg,等等
    2013-09-09
  • C++11中的時(shí)間庫(kù)std::chrono(引發(fā)關(guān)于時(shí)間的思考)

    C++11中的時(shí)間庫(kù)std::chrono(引發(fā)關(guān)于時(shí)間的思考)

    這篇文章主要介紹了C++11中的時(shí)間庫(kù)std::chrono(引發(fā)關(guān)于時(shí)間的思考),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-04-04
  • C++?Boost?Spirit精通教程

    C++?Boost?Spirit精通教程

    Boost是為C++語(yǔ)言標(biāo)準(zhǔn)庫(kù)提供擴(kuò)展的一些C++程序庫(kù)的總稱。Boost庫(kù)是一個(gè)可移植、提供源代碼的C++庫(kù),作為標(biāo)準(zhǔn)庫(kù)的后備,是C++標(biāo)準(zhǔn)化進(jìn)程的開發(fā)引擎之一,是為C++語(yǔ)言標(biāo)準(zhǔn)庫(kù)提供擴(kuò)展的一些C++程序庫(kù)的總稱
    2022-11-11
  • 基于Qt實(shí)現(xiàn)可拖動(dòng)自定義控件

    基于Qt實(shí)現(xiàn)可拖動(dòng)自定義控件

    這篇文章主要為大家詳細(xì)介紹了如何基于Qt實(shí)現(xiàn)可拖動(dòng)自定義控件,文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,感興趣的小伙伴可以了解一下
    2023-04-04
  • C++中的Reactor原理與實(shí)現(xiàn)

    C++中的Reactor原理與實(shí)現(xiàn)

    reactor設(shè)計(jì)模式是event-driven?architecture的一種實(shí)現(xiàn)方式,處理多個(gè)客戶端并發(fā)的向服務(wù)端請(qǐng)求服務(wù)的場(chǎng)景,每種服務(wù)在服務(wù)端可能由多個(gè)方法組成,這篇文章主要介紹了Reactor原理與實(shí)現(xiàn),需要的朋友可以參考下
    2022-07-07

最新評(píng)論

营山县| 汝城县| 溆浦县| 曲周县| 揭东县| 南涧| 寻乌县| 维西| 宕昌县| 新源县| 房产| 鄯善县| 平利县| 原平市| 汉沽区| 融水| 微博| 东乌珠穆沁旗| 民县| 延吉市| 都昌县| 高邮市| 平泉县| 黔南| 宜城市| 科技| 万载县| 萨嘎县| 闽侯县| 岗巴县| 大名县| 奉化市| 石林| 达州市| 襄汾县| 安陆市| 六盘水市| 肇州县| 屏山县| 新晃| 辽阳县|