在控制台中如何实现屏幕截图?

kkkgho 2008-11-17 09:00:50
似乎不能使用CDC
引入afxwin.h就报错
已经把MFC作为共享的DLL也不行

我想在控制台程序中截全屏后存入bitmap变量中
有没有可能实现?
...全文
444 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
Victor YU223 2011-10-10
  • 打赏
  • 举报
回复
8楼大牛啊
hefeng1000 2008-11-17
  • 打赏
  • 举报
回复
Graphics::TBitmap *MyBmp=new Graphics::TBitmap();
TCanvas* MyCanvas=new TCanvas();
HDC MyDC=GetWindowDC(NULL);
MyCanvas->Handle=MyDC;
TRect MyRect=Rect(0,0,Screen->Width,Screen->Height);
MyBmp->Width=MyRect.right;
MyBmp->Height=MyRect.Bottom;
MyBmp->Canvas->CopyRect(MyRect,MyCanvas,MyRect);
ReleaseDC(0,MyDC);
MyCanvas->Handle=0;
this->Image1->Picture->Bitmap=MyBmp;
delete MyCanvas;
delete MyBmp;
MessageBox(Handle,"拷贝当前屏幕图像操作成功!","信息提示",MB_OK);
jia_xiaoxin 2008-11-17
  • 打赏
  • 举报
回复
#include <iostream>
#include "windows.h"
using namespace std;

int main(int argc, char* argv[])
{
//获取当前整个屏幕DC
HDC hDC = GetDC(GetDesktopWindow());
//CDC *pDC = CDC::FromHandle(hDC);

//获得颜色模式
int BitPerPixel = GetDeviceCaps(hDC,BITSPIXEL);
int Width = GetDeviceCaps(hDC,HORZRES);
int Height = GetDeviceCaps(hDC,VERTRES);

cout << "当前屏幕色彩模式为" << BitPerPixel << "位色彩" << endl
<< "屏幕宽度:" << Width << endl
<< "屏幕高度:" << Height << endl << endl;

HDC memDC;//内存DC
memDC = CreateCompatibleDC(hDC);

HBITMAP memBitmap;
HGDIOBJ oldmemBitmap;//建立和屏幕兼容的bitmap
memBitmap = CreateCompatibleBitmap(hDC, Width, Height);

oldmemBitmap = SelectObject(memDC, memBitmap);//将memBitmap选入内存DC
BitBlt(memDC, 0, 0, Width, Height, hDC, 0, 0, SRCCOPY);//复制屏幕图像到内存DC

//以下代码保存memDC中的位图到文件
//BITMAP bmp;
//GetBitmap(&bmp);//获得位图信息

BITMAP bm;
GetObject(memBitmap, sizeof(BITMAP), (LPBYTE)&bm);

FILE *fp = fopen("Screen.bmp", "w+b");

BITMAPINFOHEADER bih = {0};//位图信息头
bih.biBitCount = bm.bmBitsPixel;//每个像素字节大小
bih.biCompression = BI_RGB;
bih.biHeight = bm.bmHeight;//高度
bih.biPlanes = 1;
bih.biSize = sizeof(BITMAPINFOHEADER);
bih.biSizeImage = bm.bmWidthBytes * bm.bmHeight;//图像数据大小
bih.biWidth = bm.bmWidth;//宽度

BITMAPFILEHEADER bfh = {0};//位图文件头
bfh.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);//到位图数据的偏移量
bfh.bfSize = bfh.bfOffBits + bm.bmWidthBytes * bm.bmHeight;//文件总的大小
bfh.bfType = (WORD)0x4d42;

fwrite(&bfh, 1, sizeof(BITMAPFILEHEADER), fp);//写入位图文件头

fwrite(&bih, 1, sizeof(BITMAPINFOHEADER), fp);//写入位图信息头

byte * p = new byte[bm.bmWidthBytes * bm.bmHeight];//申请内存保存位图数据

GetDIBits(memDC, (HBITMAP)memBitmap, 0, Height, p,
(LPBITMAPINFO) &bih, DIB_RGB_COLORS);//获取位图数据

fwrite(p, 1, bm.bmWidthBytes * bm.bmHeight, fp);//写入位图数据

delete [] p;
fclose(fp);
SelectObject(memDC,oldmemBitmap);

cout << "屏幕图像已存储到文件中" << endl;
return 0;
}
mitiao 2008-11-17
  • 打赏
  • 举报
回复
建一个MFC控制台工程吧,我写过类似的程序,使用CImage类。
kkkgho 2008-11-17
  • 打赏
  • 举报
回复
嗯,在看
太乙 2008-11-17
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 kkkgho 的回复:]
引用 3 楼 hqin6 的回复:
upup~~~~~~

用windows底层api啊!

别用mfc那套东西!


对了对了,我怎么忘记这个了,呵呵,我现在试试看(不过不会啊。。。要研究)
[/Quote]

不明白就查查msdn~~

要不就网上看看!
kkkgho 2008-11-17
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 hqin6 的回复:]
upup~~~~~~

用windows底层api啊!

别用mfc那套东西!
[/Quote]

对了对了,我怎么忘记这个了,呵呵,我现在试试看(不过不会啊。。。要研究)
太乙 2008-11-17
  • 打赏
  • 举报
回复
upup~~~~~~

用windows底层api啊!

别用mfc那套东西!
kkkgho 2008-11-17
  • 打赏
  • 举报
回复
贴一下我的截图代码

static CDC MemDc,ScrDc,MemDC1;// 屏幕和内存设备描述表
static CDC* pDC;
static CBitmap ScrBmp;
static CClientDC dc(this);
static HDC m_hdcScreen=::GetDC(NULL);

MemDc.CreateCompatibleDC(&ScrDc);//该函数创建一个与指定设备兼容的内存设备上下文环境(DC)。
ScrDc.CreateDC("display",NULL,NULL,NULL);//获取屏幕设备句柄
ScrBmp.CreateCompatibleBitmap(&ScrDc,xx,yy);//获取与ScrDc句柄相关的位图,尺寸为1024*768
  • 打赏
  • 举报
回复
友情up

64,663

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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