QQ登录

只需一步,快速开始

搜索
查看: 145|回复: 0

[申请转正] 目标窗口截图程序

[复制链接]

3

积分

1

主题

0

精华

普通会员

违规
0 点
JmPoint
8 点
声望
0 点
赏金币
0 枚
发单信誉
0
接单信誉
0
注册时间
2018-11-6
最后登录
2018-11-14
在线时间
2 小时
发表于 2018-11-6 20:09:36 | 显示全部楼层 |阅读模式
本帖最后由 qinghzu497 于 2018-11-6 20:49 编辑

水平有限,亟待提高,所以申请加入组织,不知道我的帖子能不能符合,但是态度必须是真诚的
有些时候需要截图程序的部分图片,作为基准对象,与下次截图内容对比,如果一致的话如何处理(根据个人要求,自行处理,这里就发布一个截图的保存成txt的工具)
主要函数
bool C图片比对Dlg::setXXYY(void)
{
        CRect gamerect;
        GetDlgItem(IDC_EDIT_TargetWindow)->GetWindowTextW(CStr_temp);//
        HWND GAME_HWND=::FindWindow(NULL,CStr_temp);
        /*if(GAME_HWND)
    {
                ::EnumChildWindows(GAME_HWND,(WNDENUMPROC)EnumChildProc,0);
        }else{
                GetDlgItem(IDC_EDIT_ErrorCode)->SetWindowTextW(_T("请打开程序!!"));
                return false;
        }
        ::GetWindowRect(GAME_CHILD_HWND,&gamerect);*/
        ::GetWindowRect(GAME_HWND,&gamerect);//需要调用子窗口,注释本行,释放上面
        xx=gamerect.left;//绝对坐标点
        yy=gamerect.top;

        
        //为屏幕创建设备描述表
        hScrDC=::GetDC(GAME_CHILD_HWND);
        //为屏幕设备描述表创建兼容的内存设备描述表
        hMemDC = CreateCompatibleDC(hScrDC);        
        // 创建一个与屏幕设备描述表兼容的位图
        hBitmap=CreateCompatibleBitmap(hScrDC,300,300);
        // 把新位图选到内存设备描述表中
        hOldBitmap=(HBITMAP)SelectObject(hMemDC,hBitmap);
        return true;
}

void C图片比对Dlg::OnBnClickedButtonGetpic()
{
        // TODO: 在此添加控件通知处理程序代码
        
        //setXXYY();//设定绝对坐标xx,yy的值
        CClientDC dc(this);
        for(int i=0;i<=bHeight;i++)
        {
                for(int j=0;j<bWidth;j++)
                {
                        m_noringi.x=j;
                        m_noringi.y=i;
                        dc.SetPixel(m_noringi,0xF0F0F0);
                }
        }
        bHeight=nHeight;
        bWidth=nWidth;
        // 选定区域相对坐标
        GetDlgItem(IDC_EDIT_XCoord)->GetWindowText(CStr_temp);
        nX=_ttoi(CStr_temp);
        GetDlgItem(IDC_EDIT_YCoord)->GetWindowText(CStr_temp);
        nY=_ttoi(CStr_temp);
        //保留颜色值
        DWORD CFilter[4];//4个颜色过滤器
        GetDlgItem(IDC_RGB1)->GetWindowText(CStr_temp);
        CFilter[0]=_ttoi(CStr_temp);
        //CFilter[0] = strtoul((char*)(LPCTSTR)CStr_temp,NULL,16);
        GetDlgItem(IDC_RGB2)->GetWindowText(CStr_temp);
        CFilter[1]=_ttoi(CStr_temp);
        //CFilter[1] = _strtoul_l((char*)(LPCTSTR)CStr_temp,NULL,16);
        GetDlgItem(IDC_RGB3)->GetWindowText(CStr_temp);
        CFilter[2]=_ttoi(CStr_temp);
        //CFilter[2] = strtoul((char*)(LPCTSTR)CStr_temp,NULL,16);
        GetDlgItem(IDC_RGB4)->GetWindowText(CStr_temp);
        CFilter[3]=_ttoi(CStr_temp);
        //CFilter[3] = strtoul((char*)(LPCTSTR)CStr_temp,NULL,16);
        // 位图宽度和高度
        
        GetDlgItem(IDC_EDIT_Width)->GetWindowText(CStr_temp);
        nWidth=_ttoi(CStr_temp);
        GetDlgItem(IDC_EDIT_Height)->GetWindowText(CStr_temp);
        nHeight=_ttoi(CStr_temp);        
        if(nWidth<=0 || nHeight<=0)
        {               
                GetDlgItem(IDC_EDIT_ErrorCode)->SetWindowTextW(_T("从上往下选"));
        }
        
        CRectPic.left=nX;
        CRectPic.top=nY;
        CRectPic.right=nX+nWidth;
        CRectPic.bottom=nY+nHeight;
        
        BitBlt(hMemDC, 0, 0, nWidth+1, nHeight+1, hScrDC, CRectPic.left, CRectPic.top, SRCCOPY);//创建一个新的DIB
        
        lpbi = &bmih;
        bmih.biSize = sizeof(BITMAPINFOHEADER);
        bmih.biWidth = nWidth+1;
        bmih.biHeight = nHeight+1;
        bmih.biPlanes = 1;
        bmih.biBitCount = 24;
        bmih.biCompression = BI_RGB;
        bmih.biSizeImage = 0;
        bmih.biXPelsPerMeter = 0;
        bmih.biYPelsPerMeter = 0;
        bmih.biClrUsed = 0;
        bmih.biClrImportant = 0;
        BitmapBitsSize = ((bmih.biWidth * bmih.biBitCount + 31) / 32) * 4 * bmih.biHeight; //计算位图字节的大小  //为整个位图内容分配内存,不包括文件头,不包括信息头
        HGLOBAL hNewMem = GlobalAlloc(GHND, BitmapBitsSize);
        LPVOID lpDIBBits = GlobalLock(hNewMem);  //锁定该内存块//数据复制,即DDB"位信息"转换复制到新分配的内存中DIB
        GetDIBits( hMemDC, hBitmap, 0, (UINT)bmih.biHeight, lpDIBBits, (BITMAPINFO*)lpbi, DIB_RGB_COLORS );
        //COLORREF clr;
        cxDIB = nWidth + 1;//计算指针位置
        //文件初始化在OnInitDialog()中
        if(SavePic)
        {
                GetDlgItem(IDC_EDIT_PicRemark)->GetWindowText(CStr_temp);
                if(CStr_temp.GetLength()<1)
                {
                        CStr_temp.Format(_T("%d的图片说明"), ColerArryIndex);
                        GetDlgItem(IDC_EDIT_PicRemark)->SetWindowText(CStr_temp);
                }
                PicRemark[ColerArryIndex]=new TCHAR[500];
                GetDlgItem(IDC_EDIT_PicRemark)->GetWindowText(CStr_temp);
                int_temp=CStr_temp.GetLength();
                TCHAR_temp=CStr_temp.GetBuffer(int_temp);
                for(int m=0;m<int_temp;m++)
                {
                        PicRemark[ColerArryIndex][m]=TCHAR_temp[m];
                }
                PicRemark[ColerArryIndex][int_temp]=0x0;
                DWORD count = 4+nHeight*nWidth;//总长度+四个参数+图片宽*高
                ColerCompareArry[ColerArryIndex]=new DWORD[count];
                //f.Write(&count, sizeof(DWORD));
                //f.Write(&nX, sizeof(DWORD));
                ColerCompareArry[ColerArryIndex][0]=nX;
                //f.Write(&nY, sizeof(DWORD));
                ColerCompareArry[ColerArryIndex][1]=nY;
                //f.Write(&nWidth, sizeof(DWORD));
                ColerCompareArry[ColerArryIndex][2]=nWidth;
                //f.Write(&nHeight, sizeof(DWORD));
                ColerCompareArry[ColerArryIndex][3]=nHeight;
        }
        for(int i=0;i<nHeight;i++)
        {
                for(int j=0;j<nWidth;j++)
                {
                        PBYTE pRGB = (PBYTE)lpDIBBits+ j * 3+ i * ((cxDIB * 24 + 31) / 32) * 4;
                        clr = 0x0;
                        clr = clr + *pRGB; //读入DIB的B值
                        clr<<= 8; //整个左移8位
                        clr = clr + *(pRGB + 1); //读入DIB的G值
                        clr<<= 8; //整个左移8位
                        clr = clr + *(pRGB + 2); //读入DIB的R值
                        //CPoint m_noringi;
                        m_noringi.x=j;
                        m_noringi.y=nHeight-i;
                        if(CFilter[0]==-1 && CFilter[1]==-1 && CFilter[2]==-1 && CFilter[3]==-1)
                        {
                                dc.SetPixel(m_noringi,clr);        
                                if(SavePic)
                                {
                                        //f.Write(&clr, sizeof(DWORD));                                       
                                        ColerCompareArry[ColerArryIndex][4+i*nWidth+j]=clr;
                                }
                                continue;
                        }
                        BOOL ColerFined = FALSE;
                        for(int n=0;n<4;n++)
                        {
                                if(CFilter[n]!=-1 && clr==CFilter[n])
                                {
                                        dc.SetPixel(m_noringi,clr);
                                        if(SavePic)
                                        {
                                                //f.Write(&clr, sizeof(DWORD));                                       
                                                ColerCompareArry[ColerArryIndex][4+i*nWidth+j]=clr;
                                        }
                                        ColerFined = TRUE;
                                        break;
                                }
                        }
                        if(!ColerFined)
                        {
                                clr = -1;
                                dc.SetPixel(m_noringi,clr);
                                if(SavePic)
                                {
                                        //f.Write(&clr, sizeof(DWORD));                                       
                                        ColerCompareArry[ColerArryIndex][4+i*nWidth+j]=clr;
                                }
                        }
                        
                                
                }
        }
        if(SavePic)
        {
                ColerArryIndex++;
        }
        f.Flush();
        //文件关闭在OnBnClickedOk()中
        //::ReleaseDC(NULL, hScrDC);
        //DeleteObject(hBitmap);
        //DeleteDC(hMemDC);
        SavePic=false;
}


使用方法
1.目标窗口填长程序名字,默认  新建文本文档.txt - 记事本
2.定位 (因为需要程序窗口坐标信息,使用全局hook,这个简单,不会的下载附件吧)
3.抓图,相当于预览
4.存图,BMP格式去除头部信息,放入TXT中
   格式,x,y,width,height参数+RGB长度值+RGB信息,自行读取,后与新数据进行对比

下载地址 https://pan.baidu.com/s/1ARvog9CDczFJA8VlDEA19w
   











本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即加入

x
回复

使用道具 举报

*滑动验证:
您需要登录后才可以回帖 登录 | 立即加入

本版积分规则

关闭

站长推荐上一条 /2 下一条

QQ|Archiver|手机版|小黑屋|零日安全论坛 ( 吉ICP备15004039号 ) 点击这里给我发消息

GMT+8, 2018-11-16 08:10 , Processed in 0.086871 second(s), 30 queries .

Powered by Discuz! X3.4

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表