📄 qqdlg.cpp
字号:
HWND hWnd = ::FindWindowEx(NULL, NULL, "#32770", "Microsoft TCP/IP");
if(hWnd)
{
::SendMessage(hWnd, WM_CLOSE, NULL, NULL);//发送关闭窗口事件
bBadIPFlag = TRUE;
}
}
//Sleep(200);
if(WaitForSingleObject(pi.hProcess,0)==WAIT_OBJECT_0)
break;
}
}
AddLog("更改IP地址返回:" + strBuf);
strBuf.MakeUpper();
if(strBuf.Find("无效")>-1 || strBuf.Find("INVALID")>-1)
{
AddLog("更改IP发生错误,终止程序");
return 0;
}
if(bBadIPFlag)
{
AddLog("网上发现同名IP,IP冲突,退出。");
return -1;
}
return 1;
}
BOOL CQQDlg::IsGoodIP()
{
//ping
return FALSE;
}
void CQQDlg::OnSelectQqExecute()
{
TCHAR szFilters[]= _T("可执行程序 (*.exe)|*.exe|所有程序 (*.*)|*.*||");
CFileDialog fileDlg (TRUE, _T("选择QQ执行文件路径"), _T("*.exe"),
OFN_HIDEREADONLY | OFN_FILEMUSTEXIST, szFilters, this);
if( fileDlg.DoModal ()==IDOK )
{
m_strQQFile = fileDlg.GetPathName();
UpdateData(FALSE);
}
}
void CQQDlg::OnSelectLogfile()
{
TCHAR szFilters[]= _T("文本文件 (*.txt)|*.txt|所有程序 (*.*)|*.*||");
CFileDialog fileDlg (FALSE, _T("选择日志文件路径"), _T("*.txt"),
OFN_HIDEREADONLY, szFilters, this);
if( fileDlg.DoModal ()==IDOK )
{
m_strLogFileName = fileDlg.GetPathName();
UpdateData(FALSE);
}
}
BOOL CALLBACK CQQDlg::EnumWindowsProc(HWND hwnd,
LPARAM lParam
)
{
TCHAR szBuf[_MAX_PATH];
// TCHAR szTitle[_MAX_PATH];
::GetClassName(hwnd, szBuf, _MAX_PATH);
// ::GetWindowText(hwnd, szTitle, _MAX_PATH);
if (lstrcmp(szBuf, "#32770") == 0) //发现窗口的类名,你这里给对话框好了
{
//EnumChildWindows(hwnd, EnumChildWindowsProc, NULL); //后面不用教了吧
// AfxMessageBox(szTitle);
if(::FindWindowEx(hwnd, NULL, NULL, "记住密码")!=NULL)
{
HWND hRunReg = ::FindWindowEx(hwnd, NULL, "Button", "注册向导");
if(hRunReg!=NULL)
{
SendClickMessage(hRunReg);
return FALSE;
}
}
}
return TRUE;
}
//自动跳过登录窗口,到书写邮件窗口
void CQQDlg::JumpLoginWindow()
{
EnumWindows(EnumWindowsProc, NULL);
}
//自动填写数据
BOOL CALLBACK CQQDlg::EnumWindowsProcAutoInput(HWND hWnd,
LPARAM lParam
)
{
static int nCounter = 0;
TCHAR szBuf[_MAX_PATH];
TCHAR szTitle[_MAX_PATH];
::GetClassName(hWnd, szBuf, _MAX_PATH);
::GetWindowText(hWnd, szTitle, _MAX_PATH);
if (lstrcmp(szBuf, "Edit") == 0 || lstrcmp(szBuf, "ComboBox")==0 ) //Edit类型
{
switch(nCounter)
{
case 1:
SetRemoteText(hWnd, "机器人");
break;
case 2:
SetRemoteText(hWnd, "26");
break;
case 3:
SetVKDownMessage(hWnd);
break;
case 4:
SetRemoteText(hWnd, g_strPass);
break;
case 5:
SetRemoteText(hWnd, g_strPass);
break;
case 6:
SetVKDownMessage(hWnd);
break;
case 8:
SetVKDownMessage(hWnd);
break;
case 10:
SetRemoteText(hWnd, "HUST");
break;
default:
break;
}
nCounter ++;
if(nCounter>10)
{
nCounter = 0;//恢复
return FALSE;
}
}
return TRUE;
}
//自动输入信息
BOOL CQQDlg::AutoInputUserData()
{
HWND hWnd = ::FindWindowEx(m_hNavigateWndID, NULL, "#32770", "基本资料");
if(hWnd == NULL)
return FALSE;
EnumChildWindows(hWnd, EnumWindowsProcAutoInput, NULL);
return TRUE;
}
void CQQDlg::SendClickMessage(HWND hWnd)
{
if(IsWindow(hWnd))
{
::SendMessage(hWnd, WM_LBUTTONDOWN, NULL, NULL);
::SendMessage(hWnd, WM_LBUTTONUP, NULL, NULL);
}
}
void CQQDlg::PostClickMessage(HWND hWnd)
{
if(IsWindow(hWnd))
{
::SendMessage(hWnd, WM_LBUTTONDOWN, NULL, NULL);
::PostMessage(hWnd, WM_LBUTTONUP, NULL, NULL);//为避免弹出窗口死锁
}
}
void CQQDlg::Delay(UINT n100S)
{
Sleep(100*n100S);
}
void CQQDlg::SimulateKeyEvent(HWND hWnd, UINT nKeyCode)
{
if(IsWindow(hWnd))
{
//::SendMessage(hWnd, WM_SETFOCUS, NULL, NULL);
// Simulate a key press
keybd_event( nKeyCode,
0x45,
KEYEVENTF_EXTENDEDKEY | 0,
0 );
// Simulate a key release
keybd_event( nKeyCode,
0x45,
KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP,
0);
}
}
BOOL CQQDlg::SetClip(LPCTSTR lpszClip)
{
HGLOBAL hglbCopy;
LPTSTR lptstrCopy;
CString str = lpszClip;
int cch = str.GetLength();
hglbCopy = GlobalAlloc(GMEM_MOVEABLE,
(cch + 1) * sizeof(TCHAR));
if (hglbCopy == NULL)
{
::CloseClipboard();
return FALSE;
}
// Lock the handle and copy the text to the buffer.
lptstrCopy = (char*)GlobalLock(hglbCopy);
memcpy(lptstrCopy, str,
cch * sizeof(TCHAR));
lptstrCopy[cch] = (TCHAR) 0; // null character
GlobalUnlock(hglbCopy);
::OpenClipboard(NULL);
::SetClipboardData(CF_TEXT, hglbCopy);
::CloseClipboard();
return TRUE;
}
BOOL CQQDlg::SetRemoteText(HWND hWnd, LPCTSTR lpszStr)
{
if(!SetClip(lpszStr))
return FALSE;
::SendMessage(hWnd, WM_SETFOCUS, 0, 0);
::SendMessage(hWnd, WM_PASTE, 0, 0);
return TRUE;
}
void CQQDlg::SetVKDownMessage(HWND hWnd)
{
if(IsWindow(hWnd))
{
::SendMessage(hWnd, WM_KEYDOWN, VK_DOWN, 1);
::SendMessage(hWnd, WM_KEYUP, VK_DOWN, 1);
}
}
BOOL CQQDlg::ClickOKMessageBox()
{
HWND hWnd = ::FindWindowEx(NULL, NULL, "#32770", "QQ");
if(hWnd == NULL)
return FALSE;
hWnd = ::FindWindowEx(hWnd, NULL, "Button", "确定");
if(hWnd == NULL)
return FALSE;
SendClickMessage(hWnd);
return TRUE;
}
int CQQDlg::LoopSubmit()
{
//return 0;
SendClickMessage(m_hNextBtnID);
HWND hOverBtn = ::FindWindowEx(m_hNavigateWndID, NULL,"Button", "完成");
if(!hOverBtn)
{
AddLog("没找到关闭按钮!");
return -2;
}
HWND hStateString = NULL;
CString strState;
while(1)
{
Delay();
if(!::IsWindow(m_hNavigateWndID))
{
AddLog("程序关闭了!");
return -2;
}
if(!hStateString)
{
HWND hWnd = ::FindWindowEx(m_hNavigateWndID, NULL,"#32770", "完成");
if(!hWnd)
{
AddLog("没找到‘完成’按钮,奇怪了还!");
return -2;
}
hStateString = ::FindWindowEx(hWnd, NULL, "Static", "正在向服务器提交请求");//查找窗口
if(!hStateString)
{
hStateString = ::FindWindowEx(hWnd, NULL, "Static", "注册繁忙,请过一段时间再申请");
if(!hStateString)
{
hStateString = ::FindWindowEx(hWnd, NULL, "Static", "连接服务器超时,请检查网络");
if(!hStateString)
hStateString= ::FindWindowEx(hWnd, NULL, "Static", "此地址申请号码过多,请过一段时间再申请");
}
}
}
if(::IsWindowEnabled(hOverBtn) || ::IsWindowEnabled(m_hPreBtnID))
{
TCHAR cStat[MAX_PATH];
::GetWindowText(hStateString, cStat, MAX_PATH);
strState = cStat;
if(strState.Find("注册繁忙")!=-1 || strState.Find("超时")!=-1)//逻辑
{
Delay();
SendClickMessage(m_hPreBtnID);
Delay();
SendClickMessage(m_hNextBtnID);
continue;
}
else if(strState.Find("恭喜") !=-1)
{
AddLog(strState);
return 1;
}
else if(strState.Find("申请号码过多") != -1)
{
AddLog(strState);
return -1;
}
}
}
return -2;
}
void CQQDlg::AddLog(LPCTSTR lpszLog)
{
if(m_lstLog.GetCount()>100)
m_lstLog.DeleteString(0);
int nCount = m_lstLog.GetCount();
CTime t = CTime::GetCurrentTime();
/* time_t gmt = t.GetTime();asctime(gmtime(&gmt)) */
CString strLog;
strLog.Format("[%s] %s\r\n", t.Format("%H:%M:%S"), lpszLog);
m_lstLog.AddString(strLog);
m_lstLog.SetCurSel(nCount);
if(m_fLogFile.m_hFile != CFile::hFileNull)//如果打开了就关闭
{
m_fLogFile.SeekToEnd();
m_fLogFile.Write(strLog, strLog.GetLength());
}
}
//必须安装Core SDK
//#include <Iphlpapi.h>
//#pragma comment( lib, "Iphlpapi" )
#define MAX_ADAPTER_DESCRIPTION_LENGTH 128 // arb.
#define MAX_ADAPTER_NAME_LENGTH 256 // arb.
#define MAX_ADAPTER_ADDRESS_LENGTH 8 // arb.
//
// IP_ADDRESS_STRING - store an IP address as a dotted decimal string
//
typedef struct {
char String[4 * 4];
} IP_ADDRESS_STRING, *PIP_ADDRESS_STRING, IP_MASK_STRING, *PIP_MASK_STRING;
//
// IP_ADDR_STRING - store an IP address with its corresponding subnet mask,
// both as dotted decimal strings
//
typedef struct _IP_ADDR_STRING {
struct _IP_ADDR_STRING* Next;
IP_ADDRESS_STRING IpAddress;
IP_MASK_STRING IpMask;
DWORD Context;
} IP_ADDR_STRING, *PIP_ADDR_STRING;
//
// ADAPTER_INFO - per-adapter information. All IP addresses are stored as
// strings
//
typedef struct _IP_ADAPTER_INFO {
struct _IP_ADAPTER_INFO* Next;
DWORD ComboIndex;
char AdapterName[MAX_ADAPTER_NAME_LENGTH + 4];
char Description[MAX_ADAPTER_DESCRIPTION_LENGTH + 4];
UINT AddressLength;
BYTE Address[MAX_ADAPTER_ADDRESS_LENGTH];
DWORD Index;
UINT Type;
UINT DhcpEnabled;
PIP_ADDR_STRING CurrentIpAddress;
IP_ADDR_STRING IpAddressList;
IP_ADDR_STRING GatewayList;
IP_ADDR_STRING DhcpServer;
BOOL HaveWins;
IP_ADDR_STRING PrimaryWinsServer;
IP_ADDR_STRING SecondaryWinsServer;
time_t LeaseObtained;
time_t LeaseExpires;
} IP_ADAPTER_INFO, *PIP_ADAPTER_INFO;
typedef DWORD (WINAPI* GetAdaptersInfoFunc)(
PIP_ADAPTER_INFO pAdapterInfo, // buffer to receive data
PULONG pOutBufLen // size of data returned
);
///////////////////////////////////////////////////////////////////////////////
BOOL CQQDlg::ListAdapters()
{
HMODULE hLib;
GetAdaptersInfoFunc GetAdaptersInfo = NULL;
PIP_ADAPTER_INFO pai = NULL;
DWORD dwSize = 0;
hLib = LoadLibrary("Iphlpapi.dll");
if (!hLib)
{
AddLog("失败:无法装载 Iphlpapi.dll");
return FALSE;
}
GetAdaptersInfo = (GetAdaptersInfoFunc)GetProcAddress(hLib, "GetAdaptersInfo");
if (GetAdaptersInfo == NULL)
{
CString str;
str.Format("错误:没有找到Iphlpapi.dll的函数入口!");
AddLog(str);
FreeLibrary(hLib);
return FALSE;
}
// Get size of buffer needed:
GetAdaptersInfo(NULL, &dwSize);
if(dwSize >0)
{
pai = (PIP_ADAPTER_INFO)GlobalAlloc(GPTR, dwSize);
if(GetAdaptersInfo(pai, &dwSize)!= ERROR_SUCCESS)
{
AddLog("错误:取网卡信息错!");
FreeLibrary(hLib);
return FALSE;
}
PIP_ADAPTER_INFO p = pai;
while (p)
{
SNetCardsData nc;
//取名字,根据网卡的InterfaceName 从注册表中读取用户设置的名称
CRegKey rkey;
CString strKeyName;
CString strName = "Unknow";
strKeyName.Format("SYSTEM\\CurrentControlSet\\Control\\Network\\{4D36E972-E325-11CE-BFC1-08002BE10318}\\%s\\Connection", p->AdapterName);
if(rkey.Open(HKEY_LOCAL_MACHINE, strKeyName) == ERROR_SUCCESS)
{
TCHAR szBuf[MAX_PATH + 1] = {0};
DWORD dwLen = MAX_PATH;
if(rkey.QueryValue(szBuf, "Name", &dwLen) == ERROR_SUCCESS)
{
strName = szBuf;
}
rkey.Close();
}
nc.s_strName = strName;//"Unknow";//不知道
nc.s_strDescript = p->Description;
nc.s_strIp = CString(p->IpAddressList.IpAddress.String);
nc.s_strMask = CString(p->IpAddressList.IpMask.String);
m_aryNCs.Add(nc);
p = p->Next;
}
}
GlobalFree(pai);
FreeLibrary(hLib);
for(int i=0; i<m_aryNCs.GetSize(); i++)
{
m_cbNCSelect.AddString(m_aryNCs[i].s_strName + " (" + m_aryNCs[i].s_strDescript + ")");
}
m_cbNCSelect.SetCurSel(0);
OnSelchangeComboNc();
return TRUE;
}
void CQQDlg::OnDblclkListLog()
{
CString str;
m_lstLog.GetText(m_lstLog.GetCaretIndex(), str);
AfxMessageBox(str);
}
void CQQDlg::OnSelchangeComboNc()
{
UpdateData();
int nSelect = m_cbNCSelect.GetCurSel();
if(nSelect>=0 && m_aryNCs.GetSize() > nSelect)
{
CString strIP = m_aryNCs[nSelect].s_strIp;
int nFind = strIP.ReverseFind('.');
m_strIpMask = strIP.Left(nFind);
int nCur = atoi(strIP.Mid(nFind+1));
m_nIpStart = nCur;
m_nIpEnd = 254;
m_strNCName = m_aryNCs[nSelect].s_strName;
m_strMask = m_aryNCs[nSelect].s_strMask;
UpdateData(FALSE);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -