📄 qqlogindlg.cpp
字号:
CPathDlg dlg;
dlg.SetPathType(m_nLoginType);
dlg.DoModal();
return ;
}
else if(m_nLoginType == 1 && m_strTMAppName.empty())
{
AfxMessageBox("未找到TM安装路径, 请您手动指定!");
CPathDlg dlg;
dlg.SetPathType(m_nLoginType);
dlg.DoModal();
return ;
}
// 准备参数
string strParam = " /START QQUIN:" +
m_NumberInfo[nIndex].QQUIN +
" PWDHASH:" +
m_NumberInfo[nIndex].PWDHASH +
" /STAT:" + m_NumberInfo[nIndex].STAT;
// 桌面路径
char path[MAX_PATH] = { 0 };
memset(path, 0, 255);
SHGetSpecialFolderPath(0, path, CSIDL_DESKTOPDIRECTORY, 0);
string strSave = path;
strSave += "\\";
strSave += m_nLoginType == 0 ? "QQ-" + m_NumberInfo[nIndex].NAME : "TM-" + m_NumberInfo[nIndex].NAME;
strSave += ".lnk";
CoInitialize(NULL);
if(!CreateLnk(m_nLoginType == 0 ? (char* )m_strQQAppName.c_str() : (char* )m_strTMAppName.c_str(), (char* )strSave.c_str(), (char* )strParam.c_str()))
AfxMessageBox("桌面快捷方式创建成功!");
else
AfxMessageBox("桌面快捷方式创建失败!");
CoUninitialize();
}
void CQQLoginDlg::OnLogin()
{
// 获取索引
POSITION pos = m_NumberList.GetFirstSelectedItemPosition();
int nIndex = m_NumberList.GetNextSelectedItem(pos);
if(nIndex == -1)
return ;
UpdateData();
if(m_nLoginType == 0 && m_strQQAppName.empty())
{
AfxMessageBox("未找到QQ安装路径, 请您手动指定!");
CPathDlg dlg;
dlg.SetPathType(m_nLoginType);
dlg.DoModal();
return ;
}
else if(m_nLoginType == 1 && m_strTMAppName.empty())
{
AfxMessageBox("未找到TM安装路径, 请您手动指定!");
CPathDlg dlg;
dlg.SetPathType(m_nLoginType);
dlg.DoModal();
return ;
}
if(m_nLoginType == 0)
Login(m_strQQAppName, m_NumberInfo[nIndex].QQUIN, m_NumberInfo[nIndex].PWDHASH, m_NumberInfo[nIndex].STAT);
else if(m_nLoginType == 1)
Login(m_strTMAppName, m_NumberInfo[nIndex].QQUIN, m_NumberInfo[nIndex].PWDHASH, m_NumberInfo[nIndex].STAT);
Time time;
CString strTime;
strTime.Format("%.4d-%.2d-%.2d %.2d:%.2d:%.2d", time.GetYear(), time.GetMonth(), time.GetDay(), time.GetHour(), time.GetMinute(), time.GetSecond());
m_NumberInfo[nIndex].LASTTIME = (LPSTR)(LPCTSTR)strTime;
InitNumberList();
if(!SaveNumberList())
AfxMessageBox("配置文件保存失败!");
if(m_bExit)
PostQuitMessage(0);
}
void CQQLoginDlg::OnExit()
{
PostQuitMessage(0);
}
void CQQLoginDlg::OnDel()
{
// 获取索引
POSITION pos = m_NumberList.GetFirstSelectedItemPosition();
int nIndex = m_NumberList.GetNextSelectedItem(pos);
if(nIndex == -1)
return ;
m_NumberInfo.erase(m_NumberInfo.begin() + nIndex);
InitNumberList();
if(!SaveNumberList())
AfxMessageBox("号码配置文件保存失败!");
}
void CQQLoginDlg::OnAdd()
{
CAddNumberDlg dlg;
dlg.DoModal();
}
void CQQLoginDlg::OnAbout()
{
CAboutDlg dlg;
dlg.DoModal();
}
void CQQLoginDlg::InitNumberList()
{
m_NumberList.DeleteAllItems();
for(int nCount = 0 ; nCount < m_NumberInfo.size() ; nCount++)
{
if(m_NumberInfo[nCount].NAME.empty())
m_NumberList.InsertItem(nCount, m_NumberInfo[nCount].QQUIN.c_str());
else
m_NumberList.InsertItem(nCount, m_NumberInfo[nCount].NAME.c_str());
if(m_NumberInfo[nCount].STAT == "10")
m_NumberList.SetItemText(nCount, 1, "正常登陆");
else if(m_NumberInfo[nCount].STAT == "40")
m_NumberList.SetItemText(nCount, 1, "隐身登陆");
m_NumberList.SetItemText(nCount, 2, m_NumberInfo[nCount].LASTTIME.c_str());
}
}
bool CQQLoginDlg::ReadNumberList()
{
char buf[256] = {0};
GetModuleFileName(NULL, buf, 255);
string strTmp = buf;
strTmp = strTmp.substr(0, strTmp.find_last_of("\\") + 1);
strTmp += FILENAME;
if( (_access( strTmp.c_str(), 0 )) != -1 )
{
Regedit reg;
DWORD dwDataType = 0;
DWORD dwDataLen = 0;
// read md5 value for this file from regedit
string strSubItem = "SOFTWARE\\";
strSubItem += APPNAME;
string strMD5_Reg = reg.ReadValue( HKEY_LOCAL_MACHINE,
strSubItem.c_str(),
"MD5",
(unsigned long *)&dwDataType,
(unsigned long *)&dwDataLen);
// calculate md5 value from file
MD5Ex md5;
string strMD5_File = md5.MD5File(strTmp.c_str());
if(strMD5_File != strMD5_Reg)
{
AfxMessageBox("配置文件校验错误!");
DeleteFile(strTmp.c_str()); // 删除配置文件
}
}
// Load xml config file
TiXmlDocument *pDoc = new TiXmlDocument;
if(!pDoc->LoadFile(strTmp.c_str()))
return TRUE;
// get root element
TiXmlElement *pRoot = pDoc->RootElement();
if(!pRoot)
return TRUE;
// get first child element
TiXmlElement *element = pRoot->FirstChildElement();
// fill QQINFO struct and fill the number list ctrl
int nCount = -1;
while(element)
{
nCount++;
NUMBERINFO NumberInfo;
// fill struct
NumberInfo.QQUIN = element->Attribute("QQUIN");
NumberInfo.PWDHASH = element->Attribute("PWDHASH");
NumberInfo.STAT = element->Attribute("STAT");
NumberInfo.LASTTIME = element->Attribute("LASTTIME");
NumberInfo.NAME = element->Attribute("NAME");
m_NumberInfo.push_back(NumberInfo);
element = element->NextSiblingElement();
}
return true;
}
bool CQQLoginDlg::SaveNumberList()
{
TiXmlDocument *doc = new TiXmlDocument;
TiXmlDeclaration* decl = new TiXmlDeclaration( "1.0", "GB2312", "no" );
doc->LinkEndChild( decl );
TiXmlElement * root = new TiXmlElement( "QQ" );
doc->LinkEndChild( root );
for(int i = 0; i < m_NumberInfo.size() ; i ++)
{
TiXmlElement * element = new TiXmlElement( "LIST" );
element->SetAttribute("QQUIN", m_NumberInfo[i].QQUIN.c_str());
element->SetAttribute("PWDHASH", m_NumberInfo[i].PWDHASH.c_str());
element->SetAttribute("STAT", m_NumberInfo[i].STAT.c_str());
element->SetAttribute("LASTTIME", m_NumberInfo[i].LASTTIME.c_str());
element->SetAttribute("NAME", m_NumberInfo[i].NAME.c_str());
root->LinkEndChild( element );
}
char buf[256] = {0};
GetModuleFileName(NULL, buf, 255);
string strTmp = buf;
strTmp = strTmp.substr(0, strTmp.find_last_of("\\") + 1);
strTmp += FILENAME;
if(doc->SaveFile(strTmp.c_str()))
{
Regedit reg;
MD5Ex md5;
string strMD5 = md5.MD5File(strTmp.c_str());
string strSubItem = "SOFTWARE\\";
strSubItem += APPNAME;
return reg.SetValue(HKEY_LOCAL_MACHINE, strSubItem.c_str(), REG_SZ, "MD5", (const unsigned char *)strMD5.c_str(), strMD5.length());
}
else
{
return false;
}
}
bool CQQLoginDlg::Login( string AppName, string QQUIN, string PWDHASH, string STAT )
{
STARTUPINFO si;
PROCESS_INFORMATION pi;
ZeroMemory(&si, sizeof(STARTUPINFO));
ZeroMemory(&pi, sizeof(PROCESS_INFORMATION));
si.cb = sizeof(STARTUPINFO);
string strParam = " /START QQUIN:" + QQUIN + " PWDHASH:" + PWDHASH + " /STAT:" + STAT;
bool bRet = CreateProcess( (LPSTR)AppName.c_str(),
(LPSTR)strParam.c_str(),
0, 0, TRUE, DETACHED_PROCESS, 0, NULL, &si, &pi) == 0 ? false : true;
CloseHandle(pi.hThread);
CloseHandle(pi.hProcess);
return bRet;
}
void CQQLoginDlg::OnCheckAutostart()
{
UpdateData();
Regedit reg;
// delete startup auto item
if(m_nAutoRun == 0)
reg.DeleteKey(HKEY_LOCAL_MACHINE, "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run", APPNAME);
// write startup auto item
else if(m_nAutoRun == 1)
{
char buf[256] = {0};
GetModuleFileName(NULL, buf, 255);
reg.SetValue(HKEY_LOCAL_MACHINE, "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run", REG_SZ, APPNAME, (const unsigned char *)buf, strlen(buf));
}
}
void CQQLoginDlg::InitTencentAppName()
{
Regedit reg;
DWORD dwDataLen = 0 ;
DWORD dwType = 0 ;
m_strQQAppName = reg.ReadValue(HKEY_LOCAL_MACHINE, "SOFTWARE\\TENCENT\\QQ", "Install", (unsigned long *)&dwType, (unsigned long *)&dwDataLen);
if(!m_strQQAppName.empty())
{
if(m_strQQAppName[m_strQQAppName.length() - 1] == '\\')
m_strQQAppName += "QQ.exe";
else
m_strQQAppName += "\\QQ.exe";
}
m_strTMAppName = reg.ReadValue(HKEY_LOCAL_MACHINE, "SOFTWARE\\TENCENT\\TM", "Install", (unsigned long *)&dwType, (unsigned long *)&dwDataLen);
if(!m_strTMAppName.empty())
{
if(m_strTMAppName[m_strTMAppName.length() - 1] == '\\')
m_strTMAppName += "TMShell.exe";
else
m_strTMAppName += "\\TMShell.exe";
}
}
// 创建快捷方式
// szTargetName - 目标文件名
// szSaveName - 快捷方式文件名
// szParam - 快捷方式参数
// 注意 - 调用此函数前请确认已经初始化COM环境
HRESULT CQQLoginDlg::CreateLnk(char* szTargetName, char* szSaveName, char* szParam)
{
HRESULT hRes = NULL;
IShellLink* pSehllLink = NULL;
IPersistFile* pPersistFile = NULL;
hRes = CoCreateInstance (CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER, IID_IShellLink, (void **)&pSehllLink);
if (!SUCCEEDED (hRes))
return hRes;
hRes = pSehllLink->QueryInterface (IID_IPersistFile, (void **)&pPersistFile);
if (!SUCCEEDED (hRes))
return hRes;
hRes = pSehllLink->SetPath (szTargetName);
if (!SUCCEEDED (hRes))
return hRes;
hRes = pSehllLink->SetArguments (szParam);
if (!SUCCEEDED (hRes))
return hRes;
WORD wszSaveName [MAX_PATH] = { 0 };
MultiByteToWideChar (CP_ACP, 0, szSaveName, -1, wszSaveName, MAX_PATH);
hRes = pPersistFile->Save (wszSaveName, TRUE);
if (!SUCCEEDED (hRes))
return hRes;
pSehllLink->Release ();
pPersistFile->Release ();
return hRes;
}
void CQQLoginDlg::OnBtnHelp()
{
AfxMessageBox("帮助文件还没制做呢! ^_^ ~~~\r\n请您点击右键, 所有的功能都在弹出菜单中, 鼓捣鼓捣就明白了!");
}
HBRUSH CQQLoginDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
if(pWnd->GetDlgCtrlID() == IDC_STATIC_COPYRIGHT)
{
SetBkColor(pDC->m_hDC, 0x00E77910);
return CreateSolidBrush(0x00E77910);
}
return hbr;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -