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

📄 qqlogindlg.cpp

📁 QQ自动登陆器, 同时支持TM, 利用QQ可以从命令行接收参数登陆的特点制做, 源码中有QQ密码加密的完整算法, 开发环境, VC++6.0
💻 CPP
📖 第 1 页 / 共 2 页
字号:
		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 + -