谁又屏幕捕捉的代码?能不能给我一份?

fxrw 2001-12-17 03:15:27
谁又屏幕捕捉的代码?能不能给我一份?fxrw@lilytech.com
...全文
195 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhuang094 2002-01-08
  • 打赏
  • 举报
回复
学习
JetCodeSun 2002-01-06
  • 打赏
  • 举报
回复
这是我这几天才些的,呢把打印部分去掉就行了。不用谢:)
JetCodeSun 2002-01-06
  • 打赏
  • 举报
回复
void CCapScreen1View::OnGET()
{ //截屏部分开始
CDC screenDC,memDC,*tempDC=new CDC;
CBitmap *oldImage = new CBitmap,srcImage;
HDC hscreenDC;
CSize sizeClient;

tempDC=GetDC();
hscreenDC = ::GetDC(NULL);
screenDC.Attach(hscreenDC);
memDC.CreateCompatibleDC(&screenDC);
sizeClient.cx = tempDC->GetDeviceCaps(HORZRES);
sizeClient.cy = tempDC->GetDeviceCaps(VERTRES);
tempDC->DPtoLP(&sizeClient);

srcImage.CreateCompatibleBitmap(&screenDC,sizeClient.cx,sizeClient.cy);
oldImage = memDC.SelectObject(&srcImage);
memDC.BitBlt(0,0,sizeClient.cx,sizeClient.cy,&screenDC,0,0,SRCCOPY);

ReleaseDC(&screenDC);
ReleaseDC(tempDC);
DeleteDC(hscreenDC);
//截屏部分完成

PRINTDLG pd;
CSize sizePrn;
DOCINFO di;
CDC *pDC = new CDC;

memset( &pd, 0, sizeof(PRINTDLG) ) ;

pd.lStructSize = sizeof(PRINTDLG);
pd.Flags = PD_RETURNDC;
pd.hDC = NULL;
pd.hwndOwner = NULL;
pd.hInstance = NULL;
pd.nMaxPage = 1;
pd.nMinPage = 1;
pd.nFromPage = 1;
pd.nToPage = 1;
pd.nCopies = 1;
pd.hDevMode = NULL;
pd.hDevNames = NULL;

if(PrintDlg(&pd))
{
pDC->Attach(pd.hDC);

sizePrn.cx = pDC->GetDeviceCaps(HORZRES);
sizePrn.cy = pDC->GetDeviceCaps(VERTRES);
pDC->LPtoDP(&sizePrn);

di.cbSize = sizeof(DOCINFO);
di.lpszDocName = "CapScreen Printer...";
di.lpszOutput = (LPTSTR) NULL;
di.lpszDatatype = (LPTSTR) NULL;
di.fwType = 0;

::StartDoc(pd.hDC, &di);
::StartPage(pd.hDC);

pDC->StretchBlt(0,0,sizePrn.cx,sizePrn.cy,&memDC,0,0,sizeClient.cx,sizeClient.cy,SRCCOPY);

::EndPage(pd.hDC);
::EndDoc(pd.hDC);
}
else
MessageBox("打印未完成",NULL,MB_OK);

DeleteDC(pd.hDC);
ReleaseDC(pDC);

//打印完成
}
fxrw 2001-12-20
  • 打赏
  • 举报
回复
xiaoxiaohan(萧晓寒):
谢谢!不过你贴的这个东西我早就看过了!但是我不想传参数,我想直接取的全屏幕!现在这个问题已经解决了!但分还是要给你的!
yhou31 2001-12-18
  • 打赏
  • 举报
回复
给我一份研究一下吧,我可以给你分的!
yhou31@163.net
hujun614 2001-12-18
  • 打赏
  • 举报
回复
呵呵,顺便也给我发一份吧,另外给分 hujun@serve100ok.com
请注明你的CSDN名称,以便开贴子给分。
wmouse 2001-12-18
  • 打赏
  • 举报
回复
邮箱:wmouse_csdn@etang.com
wmouse 2001-12-18
  • 打赏
  • 举报
回复
呵呵,顺便也给我发一份吧,另外给分
fxrw 2001-12-18
  • 打赏
  • 举报
回复
lhbyron:
能不能重发一份!我写错邮箱了!不好意思!yangj@lilytech.com
xiaoxiaohan 2001-12-18
  • 打赏
  • 举报
回复
用VC进行屏幕截取编程
屏幕截取是令人比较感兴趣的事情.虽然现在有不少应用程序如HYPERSNAP等可以用来截取你所喜欢的屏幕画面,但是如果能把这个功能加到自己的程序中,就更能利用它强大的作用.
下面用VC来逐步介绍在Windows95下的实现过程.首先我们要确定屏幕截取的区域,用LPRECT结构来定义.可以截取一个窗口,或整个屏幕.以下代码把选定的屏幕区域拷贝到位图中.

HBITMAP CopyScreenToBitmap(LPRECT lpRect)
//lpRect 代表选定区域
{
HDC hScrDC, hMemDC;
// 屏幕和内存设备描述表
HBITMAP hBitmap, hOldBitmap;
// 位图句柄
int nX, nY, nX2, nY2;
// 选定区域坐标
int nWidth, nHeight;
// 位图宽度和高度
int xScrn, yScrn;
// 屏幕分辨率

// 确保选定区域不为空矩形
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;
// 获得屏幕分辨率
xScrn = GetDeviceCaps(hScrDC, HORZRES);
yScrn = GetDeviceCaps(hScrDC, VERTRES);
//确保选定区域是可见的
if (nX < 0)
nX = 0;
if (nY < 0)
nY = 0;
if (nX2 > xScrn)
nX2 = xScrn;
if (nY2 > yScrn)
nY2 = yScrn;
nWidth = nX2 - nX;
nHeight = nY2 - nY;
// 创建一个与屏幕设备描述表兼容的位图
hBitmap = CreateCompatibleBitmap
(hScrDC, nWidth, nHeight);
// 把新位图选到内存设备描述表中
hOldBitmap = SelectObject(hMemDC, hBitmap);
// 把屏幕设备描述表拷贝到内存设备描述表中
BitBlt(hMemDC, 0, 0, nWidth, nHeight,
hScrDC, nX, nY, SRCCOPY);
//得到屏幕位图的句柄
hBitmap = SelectObject(hMemDC, hOldBitmap);
//清除
DeleteDC(hScrDC);
DeleteDC(hMemDC);
// 返回位图句柄
return hBitmap;
}

得到屏幕位图句柄以后,我们
可以把屏幕内容粘贴到剪贴板上.
if (OpenClipboard(hWnd))
//hWnd为程序窗口句柄
{
//清空剪贴板
EmptyClipboard();
//把屏幕内容粘贴到剪贴板上,
hBitmap 为刚才的屏幕位图句柄
SetClipboardData(CF_BITMAP, hBitmap);
//关闭剪贴板
CloseClipboard();
}
我们也可以把屏幕内容以位图格式存到磁盘文件上.

int SaveBitmapToFile(HBITMAP hBitmap ,
LPSTR lpFileName) //hBitmap 为刚才的屏幕位图句柄
{ //lpFileName 为位图文件名
HDC hDC;
//设备描述表
int iBits;
//当前显示分辨率下每个像素所占字节数
WORD wBitCount;
//位图中每个像素所占字节数
//定义调色板大小, 位图中像素字节大小 ,
位图文件大小 , 写入文件字节数
DWORD dwPaletteSize=0,
dwBmBitsSize,
dwDIBSize, dwWritten;
BITMAP Bitmap;
//位图属性结构
BITMAPFILEHEADER bmfHdr;
//位图文件头结构
BITMAPINFOHEADER bi;
//位图信息头结构
LPBITMAPINFOHEADER lpbi;
//指向位图信息头结构
HANDLE fh, hDib, hPal,hOldPal=NULL;
//定义文件,分配内存句柄,调色板句柄

//计算位图文件每个像素所占字节数
hDC = CreateDC("DISPLAY",NULL,NULL,NULL);
iBits = GetDeviceCaps(hDC, BITSPIXEL) *
GetDeviceCaps(hDC, PLANES);
DeleteDC(hDC);
if (iBits < = 1)
wBitCount = 1;
else if (iBits < = 4)
wBitCount = 4;
else if (iBits < = 8)
wBitCount = 8;
else if (iBits < = 24)
wBitCount = 24;
//计算调色板大小
if (wBitCount < = 8)
dwPaletteSize = (1 < < wBitCount) *
sizeof(RGBQUAD);

//设置位图信息头结构
GetObject(hBitmap, sizeof(BITMAP), (LPSTR)&Bitmap);
bi.biSize = sizeof(BITMAPINFOHEADER);
bi.biWidth = Bitmap.bmWidth;
bi.biHeight = Bitmap.bmHeight;
bi.biPlanes = 1;
bi.biBitCount = wBitCount;
bi.biCompression = BI_RGB;
bi.biSizeImage = 0;
bi.biXPelsPerMeter = 0;
bi.biYPelsPerMeter = 0;
bi.biClrUsed = 0;
bi.biClrImportant = 0;

dwBmBitsSize = ((Bitmap.bmWidth *
wBitCount+31)/32)* 4
*Bitmap.bmHeight ;
//为位图内容分配内存
hDib = GlobalAlloc(GHND,dwBmBitsSize+
dwPaletteSize+sizeof(BITMAPINFOHEADER));
lpbi = (LPBITMAPINFOHEADER)GlobalLock(hDib);
*lpbi = bi;
// 处理调色板
hPal = GetStockObject(DEFAULT_PALETTE);
if (hPal)
{
hDC = GetDC(NULL);
hOldPal = SelectPalette(hDC, hPal, FALSE);
RealizePalette(hDC);
}
// 获取该调色板下新的像素值
GetDIBits(hDC, hBitmap, 0, (UINT) Bitmap.bmHeight,
(LPSTR)lpbi + sizeof(BITMAPINFOHEADER)
+dwPaletteSize,
(BITMAPINFOHEADER *)
lpbi, DIB_RGB_COLORS);
//恢复调色板
if (hOldPal)
{
SelectPalette(hDC, hOldPal, TRUE);
RealizePalette(hDC);
ReleaseDC(NULL, hDC);
}
//创建位图文件
fh = CreateFile(lpFileName, GENERIC_WRITE,
0, NULL, CREATE_ALWAYS,
FILE_ATTRIBUTE_NORMAL | FILE_
FLAG_SEQUENTIAL_SCAN, NULL);
if (fh == INVALID_HANDLE_VALUE)
return FALSE;
// 设置位图文件头
bmfHdr.bfType = 0x4D42; // "BM"
dwDIBSize = sizeof(BITMAPFILEHEADER)
+ sizeof(BITMAPINFOHEADER)
+ dwPaletteSize + dwBmBitsSize;
bmfHdr.bfSize = dwDIBSize;
bmfHdr.bfReserved1 = 0;
bmfHdr.bfReserved2 = 0;
bmfHdr.bfOffBits = (DWORD)sizeof
(BITMAPFILEHEADER)
+ (DWORD)sizeof(BITMAPINFOHEADER)
+ dwPaletteSize;
// 写入位图文件头
WriteFile(fh, (LPSTR)&bmfHdr, sizeof
(BITMAPFILEHEADER), &dwWritten, NULL);
// 写入位图文件其余内容
WriteFile(fh, (LPSTR)lpbi, dwDIBSize,
&dwWritten, NULL);
//清除
GlobalUnlock(hDib);
GlobalFree(hDib);
CloseHandle(fh);
}

dongfa 2001-12-18
  • 打赏
  • 举报
回复
你已经给我分了,这个我不要了。谢谢~~~
shijinchen 2001-12-18
  • 打赏
  • 举报
回复
给我一份。另为给分!csj3210@yeah.net
nichang 2001-12-18
  • 打赏
  • 举报
回复
捕获全屏幕,不知模拟PrintScreen按键可不可以?
TalentSprite 2001-12-18
  • 打赏
  • 举报
回复
??
fxrw 2001-12-18
  • 打赏
  • 举报
回复
等一会儿!稍候放分!
dongfa 2001-12-18
  • 打赏
  • 举报
回复
我来了,呵呵~~~
runrun 2001-12-17
  • 打赏
  • 举报
回复
我有,既然发了就算了jxw2197@263.net
lhbyron 2001-12-17
  • 打赏
  • 举报
回复
给我加分!!!!已经发了!
xglcm 2001-12-17
  • 打赏
  • 举报
回复
我有可以给你lcmxg@sohu.com
fxrw 2001-12-17
  • 打赏
  • 举报
回复
最好是捕获全屏幕的代码!

16,550

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Creator Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧