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

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

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的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="后退&

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

本文介绍网络上可找到的各种禁用浏览器后退按钮方案,分析它们各自的优缺点和适 用场合.一.概述 曾经有许多人问起,"怎样才能'禁用'浏览器的后退按钮?",或者"怎样才能防止用户点击后退按钮返回以前浏 览过的页面?"在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使用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使用Cookie和JSON记录用户最近浏览历史

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

jQuery的cookie插件实现保存用户登陆信息

复制代码 代码如下: <!DOCTYPE html> <html> <head> <title>cookies.html</title> <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> <meta http-equiv="description" content="this i

jQuery.cookie.js实现记录最近浏览过的商品功能示例

本文实例讲述了jQuery.cookie.js实现记录最近浏览过的商品功能.分享给大家供大家参考,具体如下: 1.jquery.cookie.js /*jquery.cookie.js */ jquery.cookie = function(name, value, options) { if (typeof value != 'undefined') { // name and value given, set cookie options = options || {}; if (value

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

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

Asp.net MVC利用knockoutjs实现登陆并记录用户的内外网IP及所在城市(推荐)

前言 前面第一篇开了头个,现在想先从登陆写起,但感觉还有很多东西应该放在前面写,比如 1.MVC及Web API的Route配置,Web API的Route配置如何支持命名空间 2.如何配置Filters(实现安全验证.错误处理等等) 3.自定义Filters.HttpRouteConstraint.ModelBinder及HttpParameterBinding等 这些问题在我开发过程中都有碰到,但感觉每一点都要说太多了.如果有需要到时候再回过头来写. 需求 还是老样子,我们先要明白要登陆实现

Jquery操作cookie记住用户名

一.jquery.cookie.js介绍 jquery.cookie.js是一个基于jquery的插件,一个轻量级的cookie 插件,可以读取.写入.删除 cookie. jquery.cookie.js可以从Github上面获得源码 https://github.com/carhartl/jquery-cookie 二.jquery.cookie.js的基本用法介绍 jQuery操作cookie的插件,大概的使用方法如下: 1. 读取Cookie值 $.cookie('the_cookie'

jquery中cookie用法实例详解(获取,存储,删除等)

本文实例讲述了jquery中cookie用法.分享给大家供大家参考,具体如下: cookie在jquery中有指定的cookie操作类,下面我先来介绍我们在使用cookie操作类时的一些问题,然后介绍正确的使用方法. 使用JQuery操作cookie时 发生取的值不正确的问题: 结果发现cookie有四个不同的属性: 名称,内容,域,路径 $.cookie('the_cookie'); // 读取 cookie $.cookie('the_cookie', 'the_value'); // 存储

jQuery操作cookie

web开发过程中如果网站有一部分信息是存储在cookie中并与服务器交互的话,那么前台有时就会遇到需要对cookie中信息进行操作的情况,一个最典型的例子就是在前台判断用户是否登录过当前所访问的网站. 可以用js原生的代码操作cookie,不过对于已经习惯在前台使用jquery的人员来说,最好能有一种直接扩展到jquery实例对象中的方法来统一操作风格,这里记录一个个人感觉还算简洁的方案. $.extend({ cookie : function(name, val) { if (!val) {

springMVC框架下JQuery传递并解析Json数据

json作为一种轻量级的数据交换格式,在前后台数据交换中占据着非常重要的地位.Json的语法非常简单,采用的是键值对表示形式. JSON 可以将 JavaScript 对象中表示的一组数据转换为字符串,然后就可以在函数之间轻松地传递这个字符串,或者在异步应用程序中将字符串从 Web 客户机传递给服务器端程序,也可以从服务器端程序传递json格式的字符串给前端并由前端解释.这个字符串是符合json语法的,而json语法又是javascript语法的子集,所以javascript很容易解释它,而且