⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 localmessage.cpp

📁 对QQ的聊天文件进行解密的源代码,只要选择聊天记录保存的文件
💻 CPP
📖 第 1 页 / 共 2 页
字号:
#include <Windows.h>
#include <CommCtrl.h>
#include <time.h>
#include "LocalMessage.h"
#include "Main.h"
#include "Select.h"
#include "control.h"
#include "DecryptMessage.h"
#include "lib.h"
#include "About.h"
#include "resource.h"
long ppro;
int TreeWidth=158;
int ListHight=150;
int MessageColum=0;
WNDPROC wpOrigEditProc;
int ViewQQLocalMessage()
{
	int x,y;
	x=(GetSystemMetrics(SM_CXSCREEN)/2)-350;
	y=(GetSystemMetrics(SM_CYSCREEN)/2)-240;
	LocalMessage pro;
	MSG     msg;
	WNDCLASS wndclass ;
	wndclass.style         = CS_HREDRAW | CS_VREDRAW;
	wndclass.lpfnWndProc   = LocalMessage::WndProc;
	wndclass.cbClsExtra    = 0 ;
	wndclass.cbWndExtra    = 0 ;
	wndclass.hInstance     = hInstance;
	wndclass.hIcon         = NULL;
	wndclass.hCursor       = LoadCursor (NULL, IDC_ARROW);
	wndclass.hbrBackground = (HBRUSH) COLOR_WINDOW;
	wndclass.lpszMenuName  = MAKEINTRESOURCE(IDR_MENU);
	wndclass.lpszClassName = "QQLocalMessage";
	if (!RegisterClass (&wndclass))
		return 1;
	ppro=(long)&pro;
	pro.hwnd=CreateWindowEx(WS_EX_ACCEPTFILES,"QQLocalMessage","QQ消息查看器",
		WS_OVERLAPPED |WS_SYSMENU|WS_CAPTION |WS_THICKFRAME |
		WS_MINIMIZEBOX | WS_MAXIMIZEBOX,x,y,700,480,
		NULL,NULL,hInstance,NULL);
	if(pro.hwnd==INVALID_HANDLE_VALUE)
		return 2;
	while (GetMessage (&msg, NULL, 0, 0))
	{
		TranslateMessage (&msg) ;
		DispatchMessage (&msg) ;
	}
	return 0;
}
LRESULT CALLBACK LocalMessage::WndProc(HWND hwnd, UINT message,
						 WPARAM wParam, LPARAM lParam)
{
	static LocalMessage *pro;
	switch(message)
	{
	case WM_CREATE:
		pro = (LocalMessage *)ppro;
		pro->hwnd=hwnd;
		pro->WndCreate();
		break;
	case WM_CLOSE:
		pro->WndClose();
		break;
	case WM_COMMAND:
		pro->WndProcCommand(wParam,lParam);
		break;
	case WM_SIZE:
		pro->WndSize(wParam,lParam);
		break;
	case WM_MOUSEMOVE:
		pro->WndMouseMove(wParam,lParam);
		break;
	case WM_NOTIFY:
		pro->WndProcNotify(wParam,lParam);
		break;
	}
	return DefWindowProc (hwnd, message, wParam, lParam);
}
int LocalMessage::WndProcCommand(WPARAM wParam, LPARAM lParam)
{
	switch(wParam)
	{
	case ID_SELECTQQNUMBER:
		SelectFolder(hwnd);
		if(FunctionVaule==1)
			this->InitTreeView(MainWindowStruct[0].hwnd);
		break;
	case ID_EXIT:
		this->WndClose();
		break;
	case ID_ABOUT:
		About(hwnd);
		break;
	}
	return 0;
}
int LocalMessage::WndClose()
{
	ExitProcess(0);
	return 0;
}
int LocalMessage::WndCreate()
{
	SelectFolder(NULL);
	if(FunctionVaule == 0)
		SendMessage(hwnd,WM_CLOSE,NULL,NULL);
	if(FunctionVaule == 1)
	{
		this->CreateMainPane(hwnd);
		ShowWindow(hwnd,SW_SHOW);
	}

	return 0;
}
int LocalMessage::WndProcNotify(WPARAM wParam,LPARAM lParam)
{
	switch(wParam)
	{
	case IDC_MAINTREEVIEW:
		this->Tree_Notify(lParam);
		break;
	case IDC_MAINLIST:
		this->List_Notify(lParam);
		break;
	}
	return 0;
}
int LocalMessage::Tree_Notify(LPARAM lParam)
{
	HTREEITEM hItemSelected;
	HWND HwndTree;
	TVITEMW   tvItem;
	char CurrentGroup[50],CurentQQNumber[50];
	switch(((LPNMHDR)lParam)->code)
	{
	case TVN_SELCHANGED:
		HwndTree = ((LPNMTREEVIEW)lParam)->hdr.hwndFrom;
		hItemSelected =TreeView_GetSelection(HwndTree);
		if(hItemSelected)
		{
			ZeroMemory( &tvItem,sizeof(TVITEMW) );
			ZeroMemory(CurentQQNumber,50);
			tvItem.hItem = hItemSelected;
			tvItem.mask =  TVIF_TEXT||TVIF_CHILDREN;
			tvItem.stateMask = TVIS_OVERLAYMASK ;
			tvItem.pszText =(LPWSTR)CurentQQNumber;
			tvItem.cchTextMax = 50;
			if ( TreeView_GetItem(HwndTree,&tvItem)==0)
			{
				return 0;
			}
			if(IsQQNumber(CurentQQNumber)==false)
				return 0;
			ZeroMemory(&tvItem,sizeof(TVITEMW));
			ZeroMemory(CurrentGroup,50);
			tvItem.hItem= TreeView_GetParent(HwndTree,hItemSelected);
			tvItem.mask =  TVIF_TEXT||TVIF_CHILDREN;
			tvItem.stateMask = TVIS_OVERLAYMASK ;
			tvItem.pszText=(LPWSTR)CurrentGroup;
			tvItem.cchTextMax=50;
			if ( TreeView_GetItem(HwndTree,&tvItem)==0)
			{
				return 0;
			}
			if(this->ViewNameToDbName(CurrentGroup))
			{
				this->InsetValueToList(CurrentGroup,CurentQQNumber);
			}
		}
		break;
	}
	return 0;
}
int LocalMessage::CreateMainPane(HWND HwndMainWindow)
{
	for(int i = 0;i<3;i++)
	{
		MainWindowStruct[i].hwnd = CreateWindowEx(
			MainWindowStruct[i].dwExStyle,
			MainWindowStruct[i].lpClassName,
			"",
			MainWindowStruct[i].dwStyle,
			MainWindowStruct[i].x,
			MainWindowStruct[i].y,
			MainWindowStruct[i].nWidth,
			MainWindowStruct[i].nHeight,
			HwndMainWindow,
			MainWindowStruct[i].hMenu,
			hInstance,NULL);
		if(MainWindowStruct[i].hwnd == NULL)
				MessageBox(hwnd,"窗体创建失败!","",0);
		if(i==3 ||i==4)
			wpOrigEditProc=(WNDPROC)SetWindowLong(MainWindowStruct[i].hwnd,
			GWL_WNDPROC,(long)MainWindowStruct[i].WindowLong);
	}
	this->InitTreeView(MainWindowStruct[0].hwnd);
	this->InitList(MainWindowStruct[1].hwnd);
	return 0;
}
int LocalMessage::InitList(HWND HwndList)
{
	LVCOLUMN lvc;
	lvc.mask =LVCF_FMT| LVCF_WIDTH | LVCF_TEXT ;
	lvc.pszText = "发信人";
	lvc.cx =100;
	lvc.fmt =LVCFMT_LEFT;
	ListView_InsertColumn(HwndList,0,&lvc);
	lvc.pszText ="日期";
	lvc.cx =80;
	lvc.fmt =LVCFMT_CENTER;
	ListView_InsertColumn(HwndList,1,&lvc);
	lvc.pszText = "时间";
	lvc.cx =80;
	lvc.fmt =LVCFMT_CENTER;
	ListView_InsertColumn(HwndList,2,&lvc);
	lvc.pszText ="内容";
	lvc.cx =265;
	lvc.fmt =LVCFMT_LEFT;
	ListView_InsertColumn(HwndList,3,&lvc);
	SendMessage(HwndList,LVM_SETEXTENDEDLISTVIEWSTYLE,
		LVS_EX_FULLROWSELECT|LVS_EX_GRIDLINES,
		LVS_EX_FULLROWSELECT|LVS_EX_GRIDLINES);
	return 0;
}
int LocalMessage::InsetValueToList(char * CurrentGroup,char * CurrentQQNumber)
{
	char * Data=NULL,*p=NULL;
	int IndexLenght,DataLength,*Index=NULL,i,j;
	ListView_DeleteAllItems(MainWindowStruct[1].hwnd);
	if(this->ReadData(CurrentGroup,
		CurrentQQNumber,(char **)&Index,&Data,
		&IndexLenght,&DataLength))
		return 0;
	this->DecodeMessage(Data,DataLength,Index,IndexLenght);
	tm *t=0;
	char SendName[20],SendDate[30],SendTime[20],*SendData=NULL;
	int tem=0,SendDataLength=0;

	if(MessageColum==1)
		j=5;
	else if(MessageColum==2)
		j=8;
	else if(MessageColum==3)
		j=12;
	else if(MessageColum==4)
		goto Ex;
	else
		goto Ex;
	
	for(i=0; i<IndexLenght; i++)
	{
		p =Data+Index[i];
		if(*(int *)p==0)
			break;
		t=gmtime((time_t *)p);
		if(t==0)
			break;
		memset(SendName,0,20);
		memset(SendDate,0,30);
		memset(SendTime,0,20);
		wsprintf(SendDate,"%2d-%2d-%2d",(t->tm_year+1900),(t->tm_mon+1),t->tm_mday);
		wsprintf(SendTime,"%2d:%2d:%2d",t->tm_hour,t->tm_min,t->tm_sec);
		strncpy(SendName,p+4+j,(*(int *)(p+j)));
		tem =4+j+(int)*(p+j);
		SendDataLength =*(int *)(p+tem);
		SendData =(char *)malloc_(SendDataLength+8);
		if(SendData==NULL)
			break;
		strcpy(SendData,p+tem+4);

		this->InsetDataToList(MainWindowStruct[1].hwnd,i,
			SendName,SendDate,SendTime,SendData);
		if(SendData)
			free_(SendData);
		t=0;
	}
Ex:
	if(Index)
		free_(Index);
	if(Data)
		free_(Data);
	return 0;
}
int LocalMessage::InsetDataToList(HWND HwndList,int index,char* one,char * two,char * three,char *four)
{
	LVITEM lvi;
	int idx=0;
	lvi.mask = LVIF_TEXT | LVIF_PARAM | LVIF_STATE; 
	lvi.state = 0;
	lvi.stateMask = 0;
	lvi.iItem = index;
	lvi.iSubItem = 0;
	lvi.lParam = 0;
	lvi.pszText = NULL;
	ListView_InsertItem(HwndList, &lvi);
	ListView_SetItemText(HwndList,index,0,one);
	ListView_SetItemText(HwndList,index,1,two);
	ListView_SetItemText(HwndList,index,2,three);
	idx=strlen(four);
	if(four[idx-1]==0xd)
	{
		if(idx<22)
		{
			memset(four,0,idx);
			return 0;
		}
		four[idx-22]=0;
	}
	ListView_SetItemText(HwndList,index,3,four);

	return 0;
}
int LocalMessage::InitTreeView(HWND hwndTreeView)
{
	TV_ITEM           tvItem;
	TV_INSERTSTRUCT   tvInsert;
	HTREEITEM         hParentItem;
	HTREEITEM ht1,ht2,ht3,ht4;
	IStorage* ppstgOpen = NULL;
	WCHAR TemPath[MAX_PATH];
	HRESULT hr = S_OK;
	char *error;
	memset((char *)TemPath,0,(MAX_PATH*2));
	MultiByteToWideChar(CP_ACP,0,QQDatabasePath,
		(int)strlen(QQDatabasePath),TemPath,MAX_PATH);
	hr = StgOpenStorage(TemPath,NULL,0x12,NULL,NULL,&ppstgOpen);
	if(FAILED(hr))
	{
		error = "打开数据库失败!";
		goto Ex;
	}
	TreeView_DeleteAllItems(hwndTreeView);
	ListView_DeleteAllItems(MainWindowStruct[1].hwnd);
	SetWindowText(MainWindowStruct[2].hwnd,"");
	tvItem.cChildren = TRUE;
	tvItem.pszText = QQNumber;
	tvItem.mask = TVIF_TEXT |TVIF_CHILDREN;
	tvInsert.item = tvItem;
	tvInsert.hInsertAfter = TVI_SORT;
	tvInsert.hParent = TVI_ROOT;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -