我想做个截取屏幕的工具.有什么办法可以做到?!

解决方案 »

  1.   

    设置热键:然后使用以下代码就OK:直接调用下面函数:void C修改类名::savebmp()
    {
     
    CDC dc;
    dc.CreateDC("DISPLAY",NULL,NULL,NULL);
    CBitmap bm;
    int Width=GetSystemMetrics(SM_CXSCREEN);
    int Height=GetSystemMetrics(SM_CYSCREEN);
    bm.CreateCompatibleBitmap(&dc,Width,Height);
    CDC tdc;
    tdc.CreateCompatibleDC(&dc);
    CBitmap*pOld=tdc.SelectObject(&bm);
    tdc.BitBlt(0,0,Width,Height,&dc,0,0,SRCCOPY);
    tdc.SelectObject(pOld);
    BITMAP btm;
    bm.GetBitmap(&btm);
    DWORD size=btm.bmWidthBytes*btm.bmHeight;
    LPSTR lpData=(LPSTR)GlobalAllocPtr(GPTR,size);
    /////////////////////////////////////////////
    BITMAPINFOHEADER bih;
    bih.biBitCount=btm.bmBitsPixel;
    bih.biClrImportant=0;
    bih.biClrUsed=0;
    bih.biCompression=0;
    bih.biHeight=btm.bmHeight;
    bih.biPlanes=1;
    bih.biSize=sizeof(BITMAPINFOHEADER);
    bih.biSizeImage=size;
    bih.biWidth=btm.bmWidth;
    bih.biXPelsPerMeter=0;
    bih.biYPelsPerMeter=0;
    ///////////////////////////////////
    GetDIBits(dc,bm,0,bih.biHeight,lpData,(BITMAPINFO*)&bih,DIB_RGB_COLORS);
    bm.GetBitmapBits(size,lpData);
    static int filecount=0;
    CString name;
    name.Format("pict%04d.bmp",filecount++);
    name=m_Path+name;
    BITMAPFILEHEADER bfh;
    bfh.bfReserved1=bfh.bfReserved2=0;
    bfh.bfType=((WORD)('M'<< 8)|'B');
    bfh.bfSize=54+size;
    bfh.bfOffBits=54;
    CFile bf;
    if(bf.Open(name,CFile::modeCreate|CFile::modeWrite)){
    bf.WriteHuge(&bfh,sizeof(BITMAPFILEHEADER));
    bf.WriteHuge(&bih,sizeof(BITMAPINFOHEADER));
    bf.WriteHuge(lpData,size);
    bf.Close();
    nCount++;
    }
    GlobalFreePtr(lpData);
    if(nCount==1)
    m_Number.Format("%d picture captured.",nCount);
    else
    m_Number.Format("%d pictures captured.",nCount);
    UpdateData(FALSE);
    }
      

  2.   

    我想做到定时截取荧屏 ,也就是说程序运行之后每隔一段时间就截取一次屏幕.我比较菜 对上面的程序不是很明白,能给我点注释吗?!是不是有什么API函数
      

  3.   

    用GetDC和BitBlt就行了吧,要定时就加个Timer
      

  4.   

    【函数】
    GetDC【操作系统】
    Win9X:Yes
    WinNT:Yes【声明】
    GetDC Lib "user32" Alias "GetDC" (ByVal hwnd As Long) As Long【说明】  获取指定窗口的设备场景 【返回值】  Long,指定窗口的设备场景句柄,出错则为0 【其它】  若窗口所属类具有CS_OWNDC,
      CS_CLASSDC 或 CS_PARENTDC样式,则获取的设备场景属窗口或类专有。vb的窗体和图片框控件也是这种情况,它用该函数取得的结果和控件的hdc属性相同(在autoredraw为FALSE时)。您无须考虑取回的窗体或图片框控件设备场景的默认状态,特别是绘图对象。另外,默认状态随着窗体和控件autoredraw属性的设置而不同。在设备场景释放前您必须回复其状态为初始值。对于没有CS_OWNDC,
      CS_CLASSDC 或 CS_PARENTDC样式的窗口的设备场景,可从通用windows缓存中获取,其状态为默认值。缓存中可用设备场景数量是有限的,因此只要可能就释放设备场景
      用本函数获取的设备场景一定要用ReleaseDC函数释放,不能用DeleteDC【参数表】
      hwnd -----------  Long,将获取其设备场景的窗口的句柄。若为0,则要获取整个屏幕的DC
    【函数】
    BitBlt【操作系统】
    Win9X:Yes
    WinNT:Yes【声明】
    BitBlt Lib "gdi32" Alias "BitBlt" (ByVal hDestDC As Long, ByVal x As Long, ByVal y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal hSrcDC As Long, ByVal xSrc As Long, ByVal ySrc As Long, ByVal dwRop As Long) As Long【说明】  将一幅位图从一个设备场景复制到另一个。源和目标DC相互间必须兼容 【返回值】  Long,非零表示成功,零表示失败。会设置GetLastError 【其它】  在NT环境下,如在一次世界传输中要求在源设备场景中进行剪切或旋转处理,这个函数的执行会失败
      如目标和源DC的映射关系要求矩形中像素的大小必须在传输过程中改变,那么这个函数会根据需要自动伸缩、旋转、折叠、或切断,以便完成最终的传输过程【参数表】
      hDestDC --------  Long,目标设备场景  x,y ------------  Long,对目标DC中目标矩形左上角位置进行描述的那个点。用目标DC的逻辑坐标表示  nWidth,nHeight -  Long,欲传输图象的宽度和高度  hSrcDC ---------  Long,源设备场景。如光栅运算未指定源,则应设为0  xSrc,ySrc ------  Long,对源DC中源矩形左上角位置进行描述的那个点。用源DC的逻辑坐标表示  dwRop ----------  Long,传输过程要执行的光栅运算
      

  5.   

    没办法,,我实在是菜,,,我对API没有接触过.不是很明白,能给我个有注释的例子吗?!万分感谢.
      

  6.   

    给你写个简单的例子,你再加个timer,改改就能实现你要的功能了Private Declare Function GetDC Lib "user32" ( _
        ByVal hwnd As Long) As Long
    Private Declare Function BitBlt Lib "gdi32" ( _
        ByVal hDestDC As Long, _
        ByVal X As Long, _
        ByVal Y As Long, _
        ByVal nWidth As Long, _
        ByVal nHeight As Long, _
        ByVal hSrcDC As Long, _
        ByVal xSrc As Long, _
        ByVal ySrc As Long, _
        ByVal dwRop As Long) As LongPrivate Sub Form_Load()
        Me.Hide
        Me.AutoRedraw = True
        BitBlt Me.hDC, 0, 0, Screen.Width, Screen.Height, _
               GetDC(0), 0, 0, vbSrcCopy '抓屏
        Dim sFile As String
        sFile = "C:\" & Format(Now, "yyyymmddhhmmss") & ".BMP"
        SavePicture Me.Image, sFile '保存
        MsgBox "当前屏幕图像已经保存到" & sFile, 64
        End
    End Sub
      

  7.   

    To BlueBeer(1win) 
    太感谢你了,,,真的不知道怎么说好...对我们这些菜鸟,你如此的热心....感动呀.....我努力学习,以后也帮助别人~~~~