mfc模拟自动登录QQ[查找单机版连连看的剩余方块]

#pragma once
#include "atltypes.h"


// CGameModifyDlg 新建一个单文档对话框无菜单的项目。
/*mfc模拟按键打开桌面的qq登陆器输入账号密码然后登陆,本来想后台发送双击消息给桌面句柄,但是老是失败。至今不知道怎么后台点击qq,只实现了mouse_event前台点击。谁知道的话可以教教我谢了。如果运行程序时候就开着qq,qq登陆器和你的qq的类名和标题都一样,代码识别出哪个窗口是qq登陆器。还能查看qq游戏连连看剩余方块 修改内存属性禁止读取。本人邮箱liveforrevenge@qq.com附件源码下载地址<a target=_blank href="http://download.csdn.net/detail/u012786754/7446799">http://download.csdn.net/detail/u012786754/7446799</a>
CGameModifyDlg : public CDialogEx
{
// 构造
public:
	CGameModifyDlg(CWnd* pParent = NULL);	// 标准构造函数

// 对话框数据
	enum { IDD = IDD_GAMEMODIFY_DIALOG };

	protected:
	virtual void DoDataExchange(CDataExchange* pDX);	// DDX/DDV 支持


// 实现
protected:
	HICON m_hIcon;

	// 生成的消息映射函数
	virtual BOOL OnInitDialog();
	afx_msg void OnPaint();
	afx_msg HCURSOR OnQueryDragIcon();
	DECLARE_MESSAGE_MAP()
public:
	CString  m_Block;
	afx_msg void OnBnClickedButton1();
	afx_msg void OnBnClickedButton2();
	CString m_ModProperty;
	CString m_Property;
	afx_msg void OnBnClickedButton3();
private:
	DWORD block_addr;
	DWORD pID;
	HWND cwndHandle;
	DWORD gameProperty;
	HANDLE pHandle;
public:
	afx_msg void OnBnClickedButton4();
private:
	POINT pt;
public:
	afx_msg void OnBnClickedButton5();
private:
	CRect rect;
	HWND hwndLv;
public:

	VOID RepeatKeyBd(INT repeatCount)
	{
		do 
		{
			//Sleep(500);
			keybd_event(9,0,0,0);
			Sleep(200);
			keybd_event(9,0,KEYEVENTF_KEYUP,0);
			Sleep(200);
		} while (--repeatCount !=0);
	}
	HWND FindWithClassName(HWND ParentWnd, CONST PTCHAR  FindClassName);

	BOOL IncludeWindow(HWND parentHwnd,PTCHAR className,PTCHAR wndName)
	{
		HWND hw = ::FindWindowEx(parentHwnd,0,className,wndName);
		if(!hw)
			return FALSE;
		else
			return TRUE;
	}
	VOID EnterAcountOrPassword(PCHAR ap);
};


 

#include "stdafx.h"
#include "GameModify.h"
#include "GameModifyDlg.h"
#include "afxdialogex.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#endif

#define AccountStr "1234567"//qq账号
#define PasswordStr "1234567"//qq密码
// CGameModifyDlg 对话框




CGameModifyDlg::CGameModifyDlg(CWnd* pParent /*=NULL*/)
	: CDialogEx(CGameModifyDlg::IDD, pParent)
	, block_addr(0)
	, pID(0)
	, gameProperty(0)
	
{
	pt.x = pt.y = NULL;
	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
	m_ModProperty = _T("");
	m_Property = _T("");
}

void CGameModifyDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialogEx::DoDataExchange(pDX);
	DDX_Text(pDX, IDC_EDIT1, m_Block);
	DDX_Text(pDX, IDC_EDIT2, m_ModProperty);
	DDX_Text(pDX, IDC_EDIT3, m_Property);
}

BEGIN_MESSAGE_MAP(CGameModifyDlg, CDialogEx)
	ON_WM_PAINT()
	ON_WM_QUERYDRAGICON()
	ON_BN_CLICKED(IDC_BUTTON1, &CGameModifyDlg::OnBnClickedButton1)
	ON_BN_CLICKED(IDC_BUTTON2, &CGameModifyDlg::OnBnClickedButton2)
	ON_BN_CLICKED(IDC_BUTTON3, &CGameModifyDlg::OnBnClickedButton3)
	ON_BN_CLICKED(IDC_BUTTON4, &CGameModifyDlg::OnBnClickedButton4)
	ON_BN_CLICKED(IDC_BUTTON5, &CGameModifyDlg::OnBnClickedButton5)
END_MESSAGE_MAP()


// CGameModifyDlg 消息处理程序

BOOL CGameModifyDlg::OnInitDialog()
{
	CDialogEx::OnInitDialog();

	// 设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动
	//  执行此操作
	SetIcon(m_hIcon, TRUE);			// 设置大图标
	SetIcon(m_hIcon, FALSE);		// 设置小图标

	// TODO: 在此添加额外的初始化代码

	return TRUE;  // 除非将焦点设置到控件,否则返回 TRUE
}

// 如果向对话框添加最小化按钮,则需要下面的代码
//  来绘制该图标。对于使用文档/视图模型的 MFC 应用程序,
//  这将由框架自动完成。

void CGameModifyDlg::OnPaint()
{
	if (IsIconic())
	{
		CPaintDC dc(this); // 用于绘制的设备上下文

		SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);

		// 使图标在工作区矩形中居中
		int cxIcon = GetSystemMetrics(SM_CXICON);
		int cyIcon = GetSystemMetrics(SM_CYICON);
		CRect rect;
		GetClientRect(&rect);
		int x = (rect.Width() - cxIcon + 1) / 2;
		int y = (rect.Height() - cyIcon + 1) / 2;

		// 绘制图标
		dc.DrawIcon(x, y, m_hIcon);
	}
	else
	{
		CDialogEx::OnPaint();
	}
}

//当用户拖动最小化窗口时系统调用此函数取得光标
//显示。
HCURSOR CGameModifyDlg::OnQueryDragIcon()
{
	return static_cast<HCURSOR>(m_hIcon);
}



void CGameModifyDlg::OnBnClickedButton1()
{
	// TODO: 
	UpdateData(TRUE);
	//const char *temp_Block = m_Block.GetBuffer(sizeof(m_Block));
	DWORD dw_block  = _wtoi(m_Block);
	
	block_addr = 0x114E18;
	DWORD sizeOfWrite;
	 cwndHandle = ::FindWindow(L"#32770",L"QQ游戏 - 连连看角色版");
	::GetWindowThreadProcessId(cwndHandle,&pID);
	 pHandle = OpenProcess(PROCESS_ALL_ACCESS,FALSE,pID);

	if(!WriteProcessMemory(pHandle,(LPVOID)block_addr,(LPCVOID)&dw_block,sizeof(dw_block),&sizeOfWrite))
	{
		AfxMessageBox(L"写入失败!");
		printf("WriteProcessMemory failed:%d\n",GetLastError());
	}
}


void CGameModifyDlg::OnBnClickedButton2()
{
	// TODO: 在此添加控件通知处理程序代码
	UpdateData(TRUE);
	MEMORY_BASIC_INFORMATION mbi;
	size_t size = VirtualQueryEx(pHandle,(LPCVOID)block_addr,&mbi,sizeof(MEMORY_BASIC_INFORMATION));
	gameProperty = (DWORD)_wtoi(m_ModProperty);
	ASSERT(size == sizeof(MEMORY_BASIC_INFORMATION));
	if(mbi.Protect == gameProperty)
		return;
	DWORD oldProper;
	if(!VirtualProtectEx(pHandle,(LPVOID)block_addr,4,(DWORD)_wtol(m_ModProperty),&oldProper))
	{
		AfxMessageBox(L"修改属性出错!");
	}
}


void CGameModifyDlg::OnBnClickedButton3()
{
	// TODO: 在此添加控件通知处理程序代码
	CString str;
	str.Format(L"%ld",gameProperty);
	m_Property = str;
	UpdateData(FALSE);
}


void CGameModifyDlg::OnBnClickedButton4()
{
	// TODO: 在此添加控件通知处理程序代码
	HWND hProgMan = ::FindWindow(L"ProgMan", NULL);  
 
	if(hProgMan)  
	{  
		HWND hShellDefView = ::FindWindowEx(hProgMan, NULL, L"SHELLDLL_DefView", NULL);  
		if(hShellDefView)  
			hwndLv = ::FindWindowEx(hShellDefView, NULL, L"SysListView32", NULL);  
	}  
	
	int iMaxCount=ListView_GetItemCount(hwndLv);//图标数  
	_tprintf(TEXT("%d Items  hwnd:%d/r/n"),iMaxCount,hwndLv);  

	 
	DWORD dwPid;  
	GetWindowThreadProcessId(hwndLv,&dwPid);//获取进程ID  
	HANDLE hProcess=OpenProcess(PROCESS_ALL_ACCESS,false,dwPid);//打开进程  
	if (hProcess==INVALID_HANDLE_VALUE)  
	{  
		_tprintf(TEXT("Error Open Process"));//打开进程失败  
		return ;  
	}  
	LVITEM  *plvitem=(LVITEM*)VirtualAllocEx(hProcess, NULL, sizeof(LVITEM),  
		MEM_COMMIT, PAGE_READWRITE);//在目标进程内分配一块小内存  
	TCHAR *pszName=(TCHAR*)VirtualAllocEx(hProcess, NULL, MAX_PATH*sizeof(TCHAR),  
		MEM_COMMIT, PAGE_READWRITE);//分配名字  
	POINT *ppt=(POINT*)VirtualAllocEx(hProcess, NULL, sizeof(POINT),  
		MEM_COMMIT, PAGE_READWRITE);//获取坐标用  
	 RECT* pItemRc=(RECT*)VirtualAllocEx(hProcess,NULL,sizeof(RECT),MEM_COMMIT,PAGE_READWRITE);  
	for (int i=0;i<iMaxCount;i++)  
	{  
		TCHAR szName[MAX_PATH];  
		//  ListView_GetItemText(hwndLv, i, 0, szName,sizeof(szName));//获取图标名称  
		LVITEM lv={0};  
		lv.cchTextMax=MAX_PATH*sizeof(TCHAR);  
		lv.pszText=pszName;  
		WriteProcessMemory(hProcess,plvitem,&lv,sizeof(LVITEM),NULL);//吧信息写入  
		::SendMessage(hwndLv,LVM_GETITEMTEXT,i,(LPARAM)plvitem);//发送消息  
		ReadProcessMemory(hProcess,pszName,szName,sizeof(szName),NULL);//读取名字
		if(!_tcscmp(szName,L"腾讯QQ"))
		{
			  
			//  ListView_GetItemPosition(hwndLv, i, &pt);//获取图标所在坐标  
			::SendMessage(hwndLv,LVM_GETITEMPOSITION,i,(LPARAM)ppt);  
			ReadProcessMemory(hProcess,ppt,&pt,sizeof(POINT),NULL);//读取图标坐标  
			_tprintf(TEXT("%4d,%-4d  %s/r/n"),pt.x,pt.y,szName);  
			::SendMessage (hwndLv,LVM_GETITEMRECT,i,(LPARAM)pItemRc);  
			ReadProcessMemory(hProcess,pItemRc,&rect,sizeof(RECT),NULL);  
		}
		
	}  
	VirtualFreeEx(hProcess, plvitem, 0, MEM_RELEASE);//释放内存 打扫战场  
	VirtualFreeEx(hProcess, pszName, 0, MEM_RELEASE);  
	VirtualFreeEx(hProcess, ppt, 0, MEM_RELEASE);  
	CloseHandle(hProcess); 
	if(pt.x == NULL && pt.y == NULL)
	{
		SetDlgItemText(IDC_STATICPT,L"未找到坐标");
		return;
	}
	CString str;
	str.Format(L"x坐标为:%d  y坐标为%d",pt.x,pt.y);
	SetDlgItemText(IDC_STATICPT,str);  
   /* CDC *dc =  GetDlgItem(IDC_STATICPT)->GetDC();
	CSize sz = dc->GetTextExtent(str);
	CRect cr;
	GetDlgItem(IDC_STATICPT)->GetWindowRect(&cr);
    ScreenToClient(&cr);
	GetDlgItem(IDC_STATICPT)->SetWindowPos(GetParent(),cr.left,cr.right,sz.cx,sz.cy,SWP_NOMOVE);
	 GetDlgItem(IDC_STATICPT)->ReleaseDC(dc); */
}


void CGameModifyDlg::OnBnClickedButton5()
{
	// TODO: 在此添加控件通知处理程序代码
	INT x = GetSystemMetrics(SM_CXSCREEN);
	INT y = GetSystemMetrics(SM_CYSCREEN);
	
	DWORD px = (pt.x+rect.Width()/4);
	DWORD py = (pt.y+rect.Height()/4);
	
	Sleep(200);
	::SetCursorPos(px,py);
	Sleep(200);
	::mouse_event(MOUSEEVENTF_LEFTDOWN,0,0,0,0);
	Sleep(200);

	::mouse_event(MOUSEEVENTF_LEFTUP,0,0,0,0);
	Sleep(200);


	::mouse_event(MOUSEEVENTF_LEFTDOWN,0,0,0,0);
	Sleep(200);
	::mouse_event(MOUSEEVENTF_LEFTUP,0,0,0,0);
	Sleep(2000);


	/*LRESULT result = ::SendMessage(0x100F8,WM_LBUTTONDBLCLK,MK_LBUTTON,MAKELPARAM(px,py));
	Sleep(2000);*///不知道为什么这个不管用,谁知道怎么后台发送双击到桌面指定位置请留言或者密我
	HWND desk = ::GetDesktopWindow();
	HWND qqLand = FindWithClassName(desk,L"TXGuiFoundation");
	if(!qqLand)
	{
		AfxMessageBox(L"查找qq登录窗口出错");
		return;
	}
	//DWORD qqLandThreadId = GetWindowThreadProcessId(qqLand,NULL);
	//AttachThreadInput(GetWindowThreadProcessId(::GetForegroundWindow(),NULL), qqLandThreadId,TRUE); 
	::SetForegroundWindow(qqLand); 
	::SetFocus(qqLand); 
	//AttachThreadInput(GetWindowThreadProcessId(::GetForegroundWindow(),NULL), GetCurrentThreadId(),FALSE);

	//RepeatKeyBd(12);
	EnterAcountOrPassword(AccountStr);
	RepeatKeyBd(1);
	EnterAcountOrPassword(PasswordStr);
	RepeatKeyBd(6);
	Sleep(200);
	keybd_event(VK_RETURN,0,0,0);
	Sleep(200);
	keybd_event(VK_RETURN,0,KEYEVENTF_KEYUP,0);
	Sleep(200);
}


HWND CGameModifyDlg::FindWithClassName(HWND ParentWnd, CONST PTCHAR  FindClassName)
{
	HWND hChild = ::GetWindow(ParentWnd, GW_CHILD);

	TCHAR ClassName[100];
	for(; hChild!=NULL ; hChild=::GetWindow(hChild,GW_HWNDNEXT))
	{
		::GetClassName(hChild,ClassName,sizeof(ClassName)/sizeof(TCHAR));

		if (_tcscmp(ClassName,FindClassName)==0)
		{
			if(::IsWindowVisible(hChild))
			{
			    if(IncludeWindow(hChild,L"Edit",L"QQEdit"))
				   return hChild;
			}
		}

		HWND FindWnd=FindWithClassName(hChild,FindClassName);
		if (FindWnd)
			return FindWnd;
	}
	return NULL;
}


VOID CGameModifyDlg::EnterAcountOrPassword(PCHAR ap)
{
	INT count = strlen(ap);
	CHAR ch;
	BYTE bt;
	for (INT i = 0;i<count;i++)
	{
		ch = ap[i];
		if(!isdigit(ch))
		{
			bt = (BYTE)(65+ch-'a');
			Sleep(100);
			keybd_event(bt,0,0,0);
			Sleep(200);
			keybd_event(bt,0,KEYEVENTF_KEYUP,0);
			Sleep(200);
		}
		else
		{
			bt = (BYTE)(96+ch-'0');
			Sleep(100);
			keybd_event(bt,0,0,0);
			Sleep(200);
			keybd_event(bt,0,KEYEVENTF_KEYUP,0);
			Sleep(200);
		}
	}
}


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值