C++获取多浏览器上网历史记录示例代码(支持获取IE/Chrome/FireFox)



代码如下:

// FileName: BrowsHistory.h

// ------------------------------------------------------------------------------------------------------------------------
// Remarks:
//   BrowsHistory对象应该设置成全局,或者静态;防止还没有获取完网址,对象就析构了;
// ------------------------------------------------------------------------------------------------------------------------

#pragma once
#include <iostream>
#include <algorithm>
#include <functional>
#include <vector>

struct BrowsData
{
public:
    // 网址
    CString strURL;

// 对应网址访问次数
    unsigned int nCount;

// 重载<操作符
    bool operator < (const BrowsData &m)const
    {
        return nCount > m.nCount;
    }
};

class BrowsHistory
{
private:

// 保存获得的网址和访问次数
    std::vector<BrowsData> m_BrowsHistroy;

private:

// IE网址过滤,如只取网址com前边的
    void urlFiltrateIE (LPWSTR lpszSourceUrlName);

// Chrome网址过滤,如只取网址com前边的
    void urlFiltrateChrome (CString strUrlName);

// Firefox网址过滤,如只去网址com前边的
    void urlFiltrateFirefox (CString strUrlName, int nCount);

// 查询进程是否已存在, 返回true表示存在;自动结束其进程
    bool IsRunning(CString exe);

// 编码转换
    void ConvertUtf8ToGBK(CStringA &strUtf8);

// 获取浏览器历史记录
    void InitHistroy (void);

// 多线程函数
    static void ThreadPro (LPVOID * ptr);

// 对获得的网址进行排序
    void Sort (void);

public:
    BrowsHistory();
    ~BrowsHistory();

// 获取网址的进程,是否执行完;执行完时为true;
    bool m_bStatus;

// 初始化
    void Init (void);

// 获取浏览器历史记录
    std::vector<BrowsData> GetBrowsHistory(void) const;
};

代码如下:

// // FileName: BrowsHistory.cpp

#include "stdafx.h"                    // 如果编译出错请删除此行
#include "BrowsHistory.h"

#include <wininet.h>
#include "Common\\CppSQLite3.h"
#include <shlobj.h>
#include "Shlwapi.h"
#pragma  comment(lib,"Shlwapi.lib")
#include "tlhelp32.h"
#pragma comment(lib,"common\\sqlite3.lib")

#include <atlconv.h>

BrowsHistory::BrowsHistory()
{
    m_bStatus = false;
}

BrowsHistory::~BrowsHistory()
{

}

void BrowsHistory::urlFiltrateIE (LPWSTR lpszSourceUrlName)
{
    BrowsData browsDate;
    browsDate.nCount = 0;

CString strTemp(lpszSourceUrlName);

std::vector<BrowsData>::iterator iter;

// 排除非必要的网址
    if (strTemp.Find(_T("@http://")) != -1)
    {
        strTemp.Delete(0, strTemp.Find(_T("@http://"))+8);

// 排除非必要网址
        if (strTemp.Find(_T(":")) != -1)
        {
            return;
        }

int nIndex = strTemp.Find(_T("/"));
        if (nIndex != -1)
        {
            for (iter=m_BrowsHistroy.begin(); iter != m_BrowsHistroy.end(); iter++)
            {
                if (iter->strURL == strTemp.Left(nIndex))
                {
                    iter->nCount += 1;
                    return;
                }
            }

browsDate.strURL = strTemp.Left(nIndex);
            browsDate.nCount = 1;
            m_BrowsHistroy.push_back(browsDate);
        }
        else
        {
            for (iter=m_BrowsHistroy.begin(); iter != m_BrowsHistroy.end(); iter++)
            {
                if (iter->strURL == strTemp)
                {
                    iter->nCount += 1;
                    return;
                }
            }

browsDate.strURL = strTemp;
            browsDate.nCount = 1;
            m_BrowsHistroy.push_back(browsDate);
        }
    }
}

void BrowsHistory::urlFiltrateChrome (CString strUrlName)
 {
     // 删除开始的"https://"

if (strUrlName.Find(_T("https://")) != -1)
    {
        strUrlName.Delete(0, 8);
    }
    else if(strUrlName.Find(_T("http://")) != -1)
    {
         strUrlName.Delete(0, 7);
    }

int nIndex = strUrlName.Find(_T("/"));

BrowsData browsDate;
    browsDate.nCount = 0;
    std::vector<BrowsData>::iterator iter;

if (nIndex != -1)
    {
        for (iter=m_BrowsHistroy.begin(); iter != m_BrowsHistroy.end(); iter++)
        {
            if (iter->strURL == strUrlName.Left(nIndex))
            {
                iter->nCount += 1;
                return;
            }
        }

browsDate.strURL = strUrlName.Left(nIndex);
        browsDate.nCount = 1;
        m_BrowsHistroy.push_back(browsDate);
    }
    else
    {
        for (iter=m_BrowsHistroy.begin(); iter != m_BrowsHistroy.end(); iter++)
        {
            if (iter->strURL == strUrlName)
            {
                iter->nCount += 1;
                return;
            }
        }

browsDate.strURL = strUrlName;
        browsDate.nCount = 1;
        m_BrowsHistroy.push_back(browsDate);
    }
 }

void BrowsHistory::urlFiltrateFirefox (CString strUrlName, int nCount)
{
    BrowsData browsDate;
    browsDate.nCount = 0;

int nIndex = strUrlName.Find(_T("/"));
    if (nIndex != -1)
    {
        strUrlName = strUrlName.Left(nIndex);
    }

std::vector<BrowsData>::iterator iter;
    for (iter=m_BrowsHistroy.begin(); iter != m_BrowsHistroy.end(); iter++)
    {
        if (iter->strURL == strUrlName)
        {
            iter->nCount += nCount;
            return;
        }
    }

browsDate.strURL = strUrlName;
    browsDate.nCount += nCount;
    m_BrowsHistroy.push_back(browsDate);
}

bool BrowsHistory::IsRunning(CString exe)
{
    PROCESSENTRY32 pe32;
    HANDLE hprocess;
    hprocess = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
    pe32.dwSize = sizeof(PROCESSENTRY32);

if(Process32First(hprocess,&pe32))
    {
        do
        {
            HANDLE h_id;
            h_id = OpenProcess(PROCESS_TERMINATE,false,pe32.th32ProcessID);

CString exefile;
            exefile=pe32.szExeFile;
            exefile.MakeLower();
            exe.MakeLower();
            if(exefile==exe)
            {
                if (TerminateProcess(h_id, 0) !=0)
                {
                    return FALSE;
                }
                else
                {
                    return TRUE;
                }
            }
        }
        while(Process32Next(hprocess,&pe32));
    }
    return FALSE;
}

void BrowsHistory::ConvertUtf8ToGBK(CStringA &strUtf8)
{

int len=MultiByteToWideChar(CP_UTF8, 0, (LPCSTR)strUtf8, -1, NULL,0);
    unsigned short * wszGBK = new unsigned short[len+1];
    memset(wszGBK, 0, len * 2 + 2);
    MultiByteToWideChar(CP_UTF8, 0, (LPCSTR)strUtf8, -1,(LPWSTR) wszGBK, len);
    len = WideCharToMultiByte(CP_ACP, 0, (LPWSTR)wszGBK, -1, NULL, 0, NULL, NULL);
    char *szGBK=new char[len + 1];
    memset(szGBK, 0, len + 1);
    WideCharToMultiByte (CP_ACP, 0, (LPWSTR)wszGBK, -1, szGBK, len, NULL,NULL);
    strUtf8 = szGBK;
    delete[] szGBK;
    delete[] wszGBK;
}

void BrowsHistory::Init (void)
{
    // 创建一个线程
    CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)ThreadPro, this, 0, NULL);
}

void BrowsHistory::InitHistroy (void)
{

// 用来支持多次调用
    m_bStatus = false;
    m_BrowsHistroy.clear();

// 获取IE的历史记录
    HANDLE hCacheEnumHandle = NULL;
    LPINTERNET_CACHE_ENTRY_INFO lpCacheEntry = NULL;
    DWORD dwSize = 4096;
    BrowsData browsDate;
    browsDate.nCount = 0;

lpCacheEntry = (LPINTERNET_CACHE_ENTRY_INFO) new char[dwSize];
    lpCacheEntry->dwStructSize = dwSize;

hCacheEnumHandle = FindFirstUrlCacheEntry(_T("visited:"), lpCacheEntry, &dwSize);

if(hCacheEnumHandle != NULL)
    {
        urlFiltrateIE(lpCacheEntry->lpszSourceUrlName);
    }
    else
    {
        switch(GetLastError())
        {
        case ERROR_INSUFFICIENT_BUFFER:
            lpCacheEntry = (LPINTERNET_CACHE_ENTRY_INFO) new char[dwSize];
            lpCacheEntry->dwStructSize = dwSize;

hCacheEnumHandle = FindFirstUrlCacheEntry(_T("visited:"), lpCacheEntry,
                &dwSize);
            if (hCacheEnumHandle != NULL)
            {
                urlFiltrateIE(lpCacheEntry->lpszSourceUrlName);
                break;       
            }
            else
            {
                // 查找失败
                return;
            }
        default:
            {
                FindCloseUrlCache(hCacheEnumHandle);
            }
        }
    }

bool bSign = true;
    do
    {

if (FindNextUrlCacheEntry(hCacheEnumHandle, lpCacheEntry, &dwSize))
        {
            urlFiltrateIE(lpCacheEntry->lpszSourceUrlName);
        }
        else
        {
            switch(GetLastError())
            {
            case ERROR_INSUFFICIENT_BUFFER:
                lpCacheEntry =
                    (LPINTERNET_CACHE_ENTRY_INFO) new char[dwSize];
                memset(lpCacheEntry,0,dwSize);
                lpCacheEntry->dwStructSize = dwSize;

if (FindNextUrlCacheEntry(hCacheEnumHandle, lpCacheEntry,
                    &dwSize))
                {
                    urlFiltrateIE(lpCacheEntry->lpszSourceUrlName);
                    break;
                }
                else
                {
                    FindCloseUrlCache(hCacheEnumHandle);
                    bSign = false;
                    break;
                }
                break;
            case ERROR_NO_MORE_ITEMS:
                FindCloseUrlCache(hCacheEnumHandle);
                bSign = false;
                break;
            default:
                FindCloseUrlCache(hCacheEnumHandle);
                bSign = false;
                break;
            }
        }
    } while (bSign);

// 获取谷歌浏览器的历史记录
    char path[MAX_PATH];
    ::SHGetSpecialFolderPathA(NULL,path,CSIDL_LOCAL_APPDATA,FALSE);

strcat_s(path,"\\google\\chrome\\User Data\\default\\History");
    if (PathFileExistsA(path))
    {
        // 谷歌浏览器正在运行,强制关闭;关闭后才能得到谷歌浏览器的历史记录
        if (!IsRunning(_T("chrome.exe")))
        {
            try
            {
                CppSQLite3DB db;
                CppSQLite3Query query;

db.open(path);
                query=db.execQuery("select url from urls");

while(!query.eof())
                {
                    CStringA utf8url;
                    utf8url=query.fieldValue("url");
                    ConvertUtf8ToGBK(utf8url);
                    urlFiltrateChrome((CString)utf8url);
                    query.nextRow();

}
                db.close();
            }
            catch (CppSQLite3Exception& e)
            {
                return;
            }
        }
    }

// 获取火狐浏览器的历史记录
    TCHAR strPath[MAX_PATH] = {0};

GetModuleFileName(NULL, strPath, MAX_PATH);
    CString strPathTemp(strPath);

int nPosition = strPathTemp.ReverseFind(_T('\\'));

if (nPosition != -1)
    {
        USES_CONVERSION;

strPathTemp = strPathTemp.Left(nPosition);
        ::SHGetSpecialFolderPathA(NULL, path, CSIDL_WINDOWS, FALSE);
        CString strDestPath(path);

strPathTemp += _T("\\MozillaCacheView.exe /stext ");
        strDestPath += _T("\\temp.dat");
        strPathTemp += strDestPath;

// 文件路径中不能有空格
        WinExec(T2A(strPathTemp), SW_HIDE);

// 延时,防止读写冲突
        Sleep(1000);
        if (PathFileExists(strDestPath))
        {
            CStdioFile file;
            CString buffer;
            if(file.Open(strDestPath, CFile::modeRead))
            {
                CString strTemp;
                while(file.ReadString(buffer))
                {
                    if (buffer.Find(_T("image/x-icon")) != -1)
                    {
                        file.ReadString(buffer);
                        buffer.Delete(0, buffer.Find(_T("http://"))+7);

file.ReadString(strTemp);
                        file.ReadString(strTemp);
                        strTemp.Delete(0, strTemp.Find(_T(": "))+2);

urlFiltrateFirefox(buffer, atoi(T2A(strTemp)));
                    }
                }
            }
        }
    }

Sort();
}

void BrowsHistory::ThreadPro (LPVOID * ptr)
{
    BrowsHistory * pBrowsHistroy = (BrowsHistory*)ptr;
    pBrowsHistroy->InitHistroy();

// 获取网址的函数执行完了
    pBrowsHistroy->m_bStatus = true;
}

std::vector<BrowsData> BrowsHistory::GetBrowsHistory (void) const
{
    return m_BrowsHistroy;
}

void BrowsHistory::Sort (void)
{
    stable_sort(m_BrowsHistroy.begin(), m_BrowsHistroy.end(),std::less<BrowsData>());
}

时间: 2013-11-21

jQuery使用cookie与json简单实现购物车功能

本文实例讲述了jQuery使用cookie与json简单实现购物车的方法.分享给大家供大家参考,具体如下: 1.生成一个cookie 用来存储商品的id  String类型 2.添加商品id的时候 把cookie转化成数组,并检查是否已经包含了.没有包含用js push重新生成新的数组. 3.把数组转化成String 用cookie存储. 以下是jquery对cookie和JSON的操作方法 $.cookie("cart","ids",{expires:-7,pat

基于jQuery的history历史记录插件

关于jQuery的历史 jQuery history plugin helps you to support back/forward buttons and bookmarks in your javascript applications.历史的jQuery插件可以帮助您回到您的JavaScript支持应用程序/前进按钮和书签. You can store the application state into URL hash and restore the state from it.你可

javascript history对象(历史记录)使用方法(实现浏览器前进后退)

window.history对象在编写时可不使用 window 这个前缀.为了保护用户隐私,对 JavaScript 访问该对象的方法做出了限制. 方法: history.back() - 加载历史列表中的前一个URL,这与在浏览器中点击前进按钮是相同的history.forward() - 加载历史列表中的下一个URL,这与在浏览器中点击前进按钮是相同的 实例: 复制代码 代码如下: <html><button name="back" value="后退&

js 实现浏览历史记录示例

先必须要引用一个js jquery.cookie.js 1,首先写入jsCookied 复制代码 代码如下: //浏览记录 写入JSCookied 开始 var img=$("#ProductImgurl").attr("jqimg"); var name=$("#ProductDetail_ctl00_LabelName").text(); var url=location.href; var price=$("#ProductDet

jquery使用Cookie和JSON记录用户最近浏览历史

在一些电商网站,有"商品浏览历史记录"这一功能,一些视频类.小说类的网站也能记录用户最近的浏览历史.本文将使用Cookie以及JSON来讲解如何实现这一功能. Cookie可以用来记录客户端用户ID.密码.浏览过的网页.停留的时间等信息,jQuery提供了一个cookie插件,能非常方便的读写cookie信息. 基本流程: 1.获取文章详情页面文章的标题和页面地址: 2.获取浏览历史cookie信息,判断如果浏览历史的cookie中已经存在当前文章的浏览记录,则不进行任何操作: 3.如

清除网页历史记录,屏蔽后退按钮!

本文介绍网络上可找到的各种禁用浏览器后退按钮方案,分析它们各自的优缺点和适 用场合.一.概述 曾经有许多人问起,"怎样才能'禁用'浏览器的后退按钮?",或者"怎样才能防止用户点击后退按钮返回以前浏 览过的页面?"在ASP论坛上,这个问题也是问得最多的问题之一.遗憾的是,答案非常简单:我们无法禁用浏览器的后退 按钮. 起先我对于居然有人想要禁用浏览器的后退按钮感到不可思议.后来,看到竟然有那么多的人想要禁用这个后退按 钮,我也就释然(想要禁用的只有后退按钮,不包括浏览

jQuery基于json与cookie实现购物车的方法

本文实例讲述了jQuery基于json与cookie实现购物车的方法.分享给大家供大家参考,具体如下: json 格式: [{'ProductID':ABC','Num':'1'},{'ProductID':DEF,'Num':'2'}] 这里使用到了 $.cookie这个插件.这个插件的代码在文章的最后 /* 添加商品及数量到购物车cookie中,返回当前商品在cookie中的总数 */ function AddToShoppingCar(id, num) { var _num = 1; if

jQuery遍历json中多个map的方法

本文实例讲述了jQuery遍历json中多个map的方法.分享给大家供大家参考.具体实现方法如下: jQuery.each(data.root,function(key,value){ for(var i = 0 ; i < value.length; i++ ){ var tmpArr = []; var obj = value[i]; //tmpArr.push(obj["collectDate"]); tmpArr.push(3*i); tmpArr.push(obj[&q

jQuery对JSON数据进行排序输出的方法

本文实例讲述了jQuery对JSON数据进行排序输出的方法.分享给大家供大家参考.具体实现方法如下: $.getJSON('URl',function(data){ data.sort(function(a,b){return a.demoname-b.demoname}); for(i=0;i<data.length;i++){ alert(data[i].demoname) } }) 希望本文所述对大家的jQuery程序设计有所帮助.

jQuery基于扩展简单实现倒计时功能的方法

本文实例讲述了jQuery基于扩展简单实现倒计时功能的方法.分享给大家供大家参考,具体如下: jQuery.fn.countDown = function(settings,to) { settings = jQuery.extend({ startFontSize: '36px', endFontSize: '12px', duration: 1000, startNumber: 10, endNumber: 0, callBack: function() { } }, settings);

jquery调取json数据实现省市级联的方法

本文实例讲述了jquery调取json数据实现省市级联的方法.分享给大家供大家参考.具体如下: 使用jQuery mobile作为创建移动web的框架,需要实现省市级联的功能,具体代码如下(还需要优化的地方): Html代码: jQuery mobile中,有input  list属性,下方紧跟<datalist >标签,中间包含的<option value="XXXX"></option>即为选项,相当于这个input为有下拉列表的功能,当然,in

jQuery中将json数据显示到页面表格的方法

jQuery中将json数据显示到页面表格代码.stu模拟的就是一个数据库,假设我们的数据已经是json 的文件格式,接下来就是将这个json文件里面的数据显示到页面的表格上. <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title></title> <script src="js/jquery-1.8.3.js">&l

jQuery基于cookie实现的购物车实例分析

本文实例讲述了jQuery基于cookie实现的购物车.分享给大家供大家参考,具体如下: 这里分析了jquery购物车原理,包括添加商品及数量到购物车 cookie 中,判断购物车中有无商品,如果有,则把json字符串转换成对象,返回当前商品在 cookie 中的总数. 将商品放入购物车: $(function(){ $(".tc").hide(); var PId = $("#hfPId").val(); // 商品的ID var PName = $("

jQuery基于cookie实现换肤功能实例

本文实例讲述了jQuery基于cookie实现换肤功能.分享给大家供大家参考,具体如下: 换肤,在你使用QQ.浏览器.酷狗等软件时,总是能看到这两个字(也有叫皮肤).不过换肤的确能解决很多人的口味,换肤看似一个无关紧要的功能,但其实能起到吸引用户的作用.好啦,话不多说,开始上课. 附上本人的代码: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xh

基于JSON格式数据的简单jQuery幻灯片插件(jquery-slider)

jquery-slider是一款基于JSON格式数据的jQuery幻灯片插件.该幻灯片通过JSON数据来提供图片地址和描述信息等,你可以通过更换JSON数据来动态切换不同的图片. 在线预览     源码下载 使用方法 在页面中引入jquery和slider.js文件和font-awesome字体图标文件. <link rel='stylesheet' href='https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.4.0/css/font-

jQuery基于ajax操作json数据简单示例

本文实例讲述了jQuery基于ajax操作json数据的方法.分享给大家供大家参考,具体如下: jQuery Ajax 实例演示 jQuery Ajax 的三种格式,在与后台进行数据交互的时候可以是json格式也可以是xml格式,本人建议将数据转化成json格式. Xml与json的比较 1.可读性 JSON和XML的可读性可谓不相上下,一边是建议的语法,一边是规范的标签形式,很难分出胜负. 2.可扩展性 XML天生有很好的扩展性,JSON当然也有,没有什么是XML能扩展,JSON不能的. 3.