📄 localmessage.cpp
字号:
#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 + -