请求VC截屏代码,得快捷方式,以驱动的方式截屏最好哈。呵呵。

解决方案 »

  1.   

    楼主,有的话也发我一份,[email protected]
      

  2.   


    /*****************************************************
    **CScreenCap 屏幕录制类 实现
    **fansky
    **/
    #include  "stdafx.h"#include  "ScreenCap.h"
    #include  <windows.h>   
    #include  <windowsx.h>   
    #include  <memory.h>   
    #include  <mmsystem.h>   
    #include  <vfw.h>  
    BOOL CScreenCap::m_bEndCapThread = FALSE;
    int CScreenCap::m_nStaticIndex  = 0 ;
    PAVISTREAM CScreenCap::m_psCompressed = NULL ;CScreenCap::CScreenCap(void)
    {
     
    }CScreenCap::~CScreenCap(void)
    {
    }//打印屏幕线程
    DWORD WINAPI CScreenCap::ThreadCopyScreen(LPVOID lpParam)
    { while (!m_bEndCapThread)
    {
    LPBITMAPINFOHEADER *lpbi = new LPBITMAPINFOHEADER;
    if ( !CopyScreen(*lpbi))
    {
    return -1 ;
    } //m_veclpbi.push_back(lpbi) ; delete lpbi ;
    lpbi = NULL ;
    } return 0 ;
    }//打印屏幕
    //先打印几次桌面, 后再起线程 进行文件压缩处理 
    BOOL CScreenCap::CopyScreen(LPBITMAPINFOHEADER &lpbi)
    {
    HBITMAP  hbitmap ;
    HBITMAP  hbitmapOld ;   
    int cxPixInch   ;   
    int cyPixInch   ;    //进行屏幕截取
    HDC hdc ;
    hdc = GetDC(NULL) ;    HDC hdcMem ;
    hdcMem = CreateCompatibleDC(NULL) ;   hdc = CreateDC("DISPLAY", NULL, NULL, NULL); 
    HDC CompatibleHDC = CreateCompatibleDC(hdc); 
    hbitmap = CreateCompatibleBitmap(hdc,GetDeviceCaps(hdc, HORZRES),GetDeviceCaps(hdc, VERTRES)); 
    SelectObject(CompatibleHDC, hbitmap);
    BitBlt(CompatibleHDC,0,0,GetDeviceCaps(hdc, HORZRES), GetDeviceCaps(hdc, VERTRES),hdc,0,0,SRCCOPY); cxPixInch   =   GetDeviceCaps(hdc,LOGPIXELSX)   ;
    cyPixInch   =   GetDeviceCaps(hdc,LOGPIXELSY)   ;
    hbitmapOld   =   SelectBitmap(hdcMem,   hbitmap); SelectBitmap(hdcMem,   hbitmapOld);    DWORD sizeimage ;
    //把DDB 转换成 DIB
    lpbi = (LPBITMAPINFOHEADER)GlobalLock(MakeDDBToDIB(hbitmap, BI_RGB, 0, &sizeimage)); return TRUE ;
    }//DDB to DIB
    HANDLE CScreenCap::MakeDDBToDIB(HBITMAP bitmap, DWORD dwCompression, HPALETTE hPal, DWORD* sizeimage)
    {
    BITMAP            bm;
    BITMAPINFOHEADER    bi;
    LPBITMAPINFOHEADER     lpbi;
    DWORD            dwLen;
    HANDLE            hDib;
    HANDLE            handle;
    HDC             hdc; //不支持BI_BITFIELDS类型
    if( dwCompression == BI_BITFIELDS )
    {
    return NULL;
    } //如果调色板为空,则用默认调色板
    if (hPal==NULL)
    {
    hPal = (HPALETTE) GetStockObject(DEFAULT_PALETTE );
    } //获取位图信息
    GetObject(bitmap,sizeof(bm),(LPSTR)&bm); //初始化位图信息头
    bi.biSize        = sizeof(BITMAPINFOHEADER);
    bi.biWidth        = bm.bmWidth;
    bi.biHeight         = bm.bmHeight;
    bi.biPlanes         = 1;
    bi.biBitCount        = bm.bmPlanes * bm.bmBitsPixel;
    bi.biCompression    = dwCompression;
    bi.biSizeImage        = 0;
    bi.biXPelsPerMeter    = 0;
    bi.biYPelsPerMeter    = 0;
    bi.biClrUsed        = 0;
    bi.biClrImportant    = 0; //计算信息头及颜色表大小
    int ncolors = (1 << bi.biBitCount);
    if( ncolors> 256 )
    {
    ncolors = 0;
    }
    dwLen  = bi.biSize + ncolors * sizeof(RGBQUAD); //hdc = GetDC();
    hdc = CreateDC("DISPLAY", NULL, NULL, NULL) ;
    hPal = SelectPalette(hdc,hPal,FALSE);
    RealizePalette(hdc); //为信息头及颜色表分配内存
    hDib = GlobalAlloc(GMEM_FIXED,dwLen); if (!hDib)
    {
    SelectPalette(hdc,hPal,FALSE);
    //ReleaseDC(hdc);
    return NULL;
    } lpbi = (LPBITMAPINFOHEADER)hDib;
    *lpbi = bi;
    //调用 GetDIBits 计算图像大小
    GetDIBits(hdc, bitmap, 0L, (DWORD)bi.biHeight,
    (LPBYTE)NULL, (LPBITMAPINFO)lpbi, (DWORD)DIB_RGB_COLORS ); bi = *lpbi;
    //图像的每一行都对齐(32bit)边界
    if (bi.biSizeImage == 0)
    {
    bi.biSizeImage = ((((bi.biWidth * bi.biBitCount) + 31) & ~31) / 8) 
    * bi.biHeight;
    if (dwCompression != BI_RGB)
    {
    bi.biSizeImage = (bi.biSizeImage * 3) / 2;
    }
    }
      

  3.   

    最简单的:
    CClientDC dc(this);
    CBitmap* pScreenBitmap = dc.GetCurrentBitmap();