请求VC截屏代码,得快捷方式,以驱动的方式截屏最好哈。呵呵。 请求VC截屏代码,得快捷方式,以驱动的方式截屏最好哈。呵呵。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 楼主,有的话也发我一份,[email protected] /*******************************************************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 DIBHANDLE 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; } } 最简单的:CClientDC dc(this);CBitmap* pScreenBitmap = dc.GetCurrentBitmap(); 问个SOAP相关的客户端调用。 CToolBar文本置位问题 界面里有张图,当界面拉大后,如何保证图大小不变,居中显示并四周填充黑边 关于文档窗口 如何实现把一块内存当作文件来访问,而不把这块内存里的东西写到硬里盘 Windows核心编程枚举进程例子中是怎样判断当前进程的? 网络序,主机序 请教CString 转换为整形 如何在VC中兼容C的函数呢请高手指点~~` 难道发送消息到窗口有那些方法? 问一下VC中窗口如何实现浮动选区 这个 this 指什么?
/*****************************************************
**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;
}
}
CClientDC dc(this);
CBitmap* pScreenBitmap = dc.GetCurrentBitmap();