www.pudn.com > QqMsgView.rar > LocalMessage.cpp
#include#include #include #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 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; hParentItem = TreeView_InsertItem(hwndTreeView, &tvInsert); tvItem.pszText ="聊天消息"; tvInsert.item = tvItem; tvInsert.hInsertAfter = TVI_LAST; tvInsert.hParent = hParentItem; ht1 = TreeView_InsertItem(hwndTreeView, &tvInsert); if( this->InsertToTreeView(hwndTreeView,"C2CMsg",ht1,&ppstgOpen)) TreeView_DeleteItem(hwndTreeView,ht1); tvItem.pszText ="系统消息"; tvInsert.item = tvItem; tvInsert.hInsertAfter = TVI_LAST; tvInsert.hParent = hParentItem; ht2 = TreeView_InsertItem(hwndTreeView, &tvInsert); if(this->InsertToTreeView(hwndTreeView,"SysMsg",ht2,&ppstgOpen)) TreeView_DeleteItem(hwndTreeView,ht2); tvItem.pszText ="群组消息"; tvInsert.item = tvItem; tvInsert.hInsertAfter = TVI_LAST; tvInsert.hParent = hParentItem; ht3 = TreeView_InsertItem(hwndTreeView, &tvInsert); if(this->InsertToTreeView(hwndTreeView,"GroupMsg",ht3,&ppstgOpen)) TreeView_DeleteItem(hwndTreeView,ht3); tvItem.pszText ="临时消息"; tvInsert.item = tvItem; tvInsert.hInsertAfter = TVI_LAST; tvInsert.hParent = hParentItem; ht4 = TreeView_InsertItem(hwndTreeView, &tvInsert); if(this->InsertToTreeView(hwndTreeView,"TempSessionMsg",ht4,&ppstgOpen)) TreeView_DeleteItem(hwndTreeView,ht4); TreeView_Expand(hwndTreeView,hParentItem,TVE_TOGGLE); ppstgOpen->Release(); return 0; Ex: char mm[21]; wsprintf(mm,"%08X",hr); MessageBox(hwnd,error,mm,NULL); return hr; } int LocalMessage::InsertToTreeView(HWND HwndTreeView,char * db,HTREEITEM TreeParent,IStorage** is) { TV_ITEM tvItem; TV_INSERTSTRUCT tvInsert; WCHAR wdb[50]; IStorage* pp = *is; IStorage* ppstgOpen = NULL; IEnumSTATSTG* ppenum =NULL; HRESULT hr = S_OK; char *error,QQMessageNumber[20]; char *pName; STATSTG rgelt; ULONG pceltFetched=1; size_t NameLength; int i=0; memset((char *)wdb,0,100); MultiByteToWideChar(CP_ACP,0,db,(int)strlen(db),wdb,50); hr = pp->OpenStorage(wdb,NULL,0x12,NULL,NULL,&ppstgOpen); if(FAILED(hr)) { error = "读取数据库失败!"; goto Ex; } hr = ppstgOpen->EnumElements(NULL,NULL,NULL,&ppenum); if(FAILED(hr)) { error = "Failed ppstgOpen->EnumElements"; goto Ex; } while(pceltFetched) { hr = ppenum->Next(1,&rgelt,&pceltFetched); if(FAILED(hr)) { error = "Failed Next"; goto Ex; } if(rgelt.pwcsName) { ZeroMemory(QQMessageNumber,20); WideCharToMultiByte(CP_ACP,0,rgelt.pwcsName,wcslen(rgelt.pwcsName), QQMessageNumber,20,NULL,NULL); pName =QQMessageNumber; NameLength = strlen(pName); if(NameLength>9 || NameLength<5) goto conti; while(*pName) { if(*pName<0x30 || *pName >0x39) goto conti; pName++; } tvItem.cChildren = false; tvItem.pszText = QQMessageNumber; tvItem.mask = TVIF_TEXT |TVIF_CHILDREN; tvInsert.item = tvItem; tvInsert.hInsertAfter = TVI_LAST; tvInsert.hParent = TreeParent; TreeView_InsertItem(HwndTreeView, &tvInsert); i++; } conti:; } ppenum->Release(); ppstgOpen->Release(); if(i==0) return 1; return 0; Ex: char tem[100]; wsprintf(tem,"操作数据库%s",db); //MessageBox(hwnd,error,tem,NULL); if(ppenum) ppenum->Release(); if(ppstgOpen) ppstgOpen->Release(); return 1; } int LocalMessage::WndSize(WPARAM wParam,LPARAM lParam) { MoveWindow(MainWindowStruct[0].hwnd,0,0,TreeWidth,HIWORD(lParam),true); MoveWindow(MainWindowStruct[1].hwnd,TreeWidth+2,0,LOWORD(lParam)-TreeWidth-2,HIWORD(lParam)-ListHight,true); MoveWindow(MainWindowStruct[2].hwnd,TreeWidth+2, HIWORD(lParam)-ListHight+30,LOWORD(lParam)-TreeWidth-2,ListHight-30,true); return 0; } LRESULT APIENTRY WndSplit(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { switch(message) { case WM_MOUSEMOVE: MessageBeep(0); break; } //WM_NCMOUSEMOVE return CallWindowProc(wpOrigEditProc, hwnd, message,wParam, lParam); } int LocalMessage::WndMouseMove(WPARAM wParam,LPARAM lParam) { char tem[10]; RECT rect; GetClientRect(hwnd,&rect); if(LOWORD(lParam)==TreeWidth || LOWORD(lParam)==(TreeWidth+1)) { wsprintf(tem,"%2d",LOWORD(lParam)); //SetWindowText(hwnd,tem); //SetCursor(LoadCursor(hInstance,IDC_HAND)); //ShowCursor(true); if(wParam==MK_LBUTTON) { SetCapture(hwnd); //MessageBeep(0); //SendMessage(hwnd,WM_SIZE,) } } if((HIWORD(lParam)==(rect.bottom -ListHight+28))||(HIWORD(lParam)==(rect.bottom -ListHight+29))&&LOWORD(lParam)>TreeWidth) { wsprintf(tem,"%2d",HIWORD(lParam)); //SetWindowText(hwnd,tem); } return 0; } int LocalMessage::ViewNameToDbName(char * name) { if(strcmp(name,"聊天消息")==0) { ZeroMemory(name,50); strcpy(name,"C2CMsg"); MessageColum =1; return 1; } if(strcmp(name,"系统消息")==0) { ZeroMemory(name,50); strcpy(name,"SysMsg"); MessageColum =2; return 2; } if(strcmp(name,"群组消息")==0) { ZeroMemory(name,50); strcpy(name,"GroupMsg"); MessageColum =3; return 3; } if(strcmp(name,"临时消息")==0) { ZeroMemory(name,50); strcpy(name,"TempSessionMsg"); MessageColum =4; return 4; } return 0; } int LocalMessage::ReadData(char * CurrentGroup,char * CurrentQQNumber,char ** pIndex,char ** pData,int * IndexLength,int * DataLength) { IStorage* ppstgOpen = NULL; IStorage* ppstgOpen1 = NULL; IStorage* ppstgOpen2 = NULL; char *Index =NULL; char *Data =NULL; WCHAR TemPath[MAX_PATH]; WCHAR TemGroup[50],TemQQNumber[20]; HRESULT hr = S_OK; char *error; memset((char *)TemPath,0,(MAX_PATH*2)); memset((char *)TemGroup,0,100); memset((char *)TemQQNumber,0,40); MultiByteToWideChar(CP_ACP,0,QQDatabasePath, (int)strlen(QQDatabasePath),TemPath,MAX_PATH); MultiByteToWideChar(CP_ACP,0,CurrentGroup, (int)strlen(CurrentGroup),TemGroup,50); MultiByteToWideChar(CP_ACP,0,CurrentQQNumber, (int)strlen(CurrentQQNumber),TemQQNumber,20); hr = StgOpenStorage(TemPath,NULL,0x12,NULL,NULL,&ppstgOpen); if(FAILED(hr)) { error = "打开数据库失败!"; goto Ex; } hr = ppstgOpen->OpenStorage(TemGroup,NULL,0x12,NULL,NULL,&ppstgOpen1); if(FAILED(hr)) { error = "ppstgOpen1!"; goto Ex; } hr =ppstgOpen1->OpenStorage(TemQQNumber,NULL,0x12,NULL,NULL,&ppstgOpen2); if(FAILED(hr)) { error = "&ppstgOpen2"; goto Ex; } IStream *ppstm =NULL; STATSTG rgelt; ULONG DataLength0=0; hr = ppstgOpen2->OpenStream(L"Index.msj",NULL,0x12,NULL,&ppstm); if(FAILED(hr)) { error = "&ppstm Index.msj"; goto Ex; } ppstm->Stat(&rgelt,NULL); if(rgelt.cbSize.LowPart==0) goto Ex; Index = (char *)malloc_(rgelt.cbSize.LowPart+8); ZeroMemory(Index,rgelt.cbSize.LowPart+8); hr = ppstm->Read(Index,rgelt.cbSize.LowPart,&DataLength0); if(FAILED(hr)) { error = "Read error"; free(Index); ppstm->Release(); goto Ex; } *IndexLength =(rgelt.cbSize.LowPart/4); ppstm->Release(); hr = ppstgOpen2->OpenStream(L"Data.msj",NULL,0x12,NULL,&ppstm); if(FAILED(hr)) { error = "&ppstm Data.msj"; goto Ex; } ppstm->Stat(&rgelt,NULL); if(rgelt.cbSize.LowPart==0) goto Re; Data = (char *)malloc_(rgelt.cbSize.LowPart+8); ZeroMemory(Data,rgelt.cbSize.LowPart+8); hr = ppstm->Read(Data,rgelt.cbSize.LowPart,&DataLength0); if(FAILED(hr)) { error = "Read error"; free(Data); ppstm->Release(); goto Ex; } *DataLength =rgelt.cbSize.LowPart; *pIndex = Index; *pData = Data; Re: ppstm->Release(); ppstgOpen2->Release(); ppstgOpen1->Release(); ppstgOpen->Release(); return 0; Ex: //MessageBox(hwnd,error,"",0); if(ppstgOpen2) ppstgOpen2->Release(); if(ppstgOpen1) ppstgOpen1->Release(); if(ppstgOpen) ppstgOpen->Release(); return 1; } int LocalMessage::DecodeMessage(char * message,int Length,int * Index,int number) { char *pout; int i; int MessageLength=0; for(i =0;i code) { case NM_CLICK: case NM_RCLICK: text=(char *)malloc_(0x2000); ListView_GetItemText(((NMITEMACTIVATE *)lParam)->hdr.hwndFrom, ((NMITEMACTIVATE *)lParam)->iItem,3,text,0x2000); SetWindowText(MainWindowStruct[2].hwnd,text); free_(text); break; } return 0; }