怎样对桌面截图?
怎样对桌面截图,即如何把桌面的内容保存成BMP文件? 问题点数:20、回复次数:5Top
1 楼DavidWhite(勇介)回复于 2002-06-24 13:17:03 得分 8
按下键盘上的print screen键,怎么在画图工具里按Ctrl+V就可以啦;)
如果你说的是编程的话我也不会,帮你up一下:0Top
2 楼fhbkyo(光荣潜水员)回复于 2002-06-24 15:00:08 得分 2
楼上说了,如果是当前窗口
Alt+Print就可以了Top
3 楼spwnihao(╭∩╮(︶⌒︶)╭∩╮鄙视一切)回复于 2002-06-24 15:02:38 得分 10
如果你要用手操作的话,上面说得对
如果你要用程序写的话:
拷贝屏幕
BitBlt函数可以将一幅位图从一个设备场景拷贝到另一个设备场景,这个函数经常用在抓图程序和游戏编程方面,也可以用来做基于桌面的屏幕保护程序。下面让我们用BitBlt函数来做一个虚假桌面的程序:
首先,添加一个Image组件到窗体中,将窗体Form1的BorderStyle属性设为:bsNone。
接着在窗体的OnCreate事件加入程序代码:
Left=0;
Top=0;
Width=Screen->Width;
Height=Screen->Height;
Image1->Left=0;
Image1->Top=0;
Image1->Width=Screen->Width;
Image1->Height=Screen->Height;
//这句代码就是将桌面拷贝到组件Image1中来存放,
// 其中GetDC(0)返回桌面设备的句柄(HDC)
BitBlt(Image1->Canvas->Handle,0,0,Screen->Width,Screen->Height,GetDC(0),0,0,SRCCOPY);
按F9运行,一个假的桌面就出来了,在这个“桌面”上怎么按鼠标都没有反应,可以用来捉弄人喔!。有些桌面的小游戏也是这么干的,你可以在这个程序的基础上加上更多的功能,如在窗体上加上Label组件和Timer组件,用Timer组件来控制Label组件在窗体上移动,再在窗体Form1的OnKeyDown事件和Image1的OnMouseDown事件中加入关闭窗口的代码“Close();”,最后将编译了的程序的扩展名改为scr,这就成了一个文字在桌面上乱动的屏幕保护程序了。Top
4 楼lvxn_sina(XN)回复于 2002-06-24 15:49:24 得分 0
我按了好都遍怎么没反映啊?!
不过我知道有个叫Hyper???什么的,很好用的!Top
5 楼gothing()回复于 2002-06-24 16:33:24 得分 0
vc怎么处理?
下面可以得到指定窗口的,但不知如何得到桌面的CWnd, 用spy++再FindWindow()也没用!!
CWnd* m_pWndPlay;
FindWndPlay();
if(m_pWndPlay == NULL)
{
AfxMessageBox("not find");
return;
}
//m_pWndPlay->SetWindowPos(
HDC hScrDC;
CBitmap bitmap, *oldbitmap, *newbitmap = NULL;
int nX, nY, nX2, nY2;
int nWidth, nHeight;
int xScrn, yScrn; //屏幕分辨率
RECT lpRect;
m_pWndPlay->GetClientRect(&lpRect);
if (IsRectEmpty(&lpRect)) return;
//为屏幕创建设备上下文
hScrDC = CreateDC("DISPLAY", NULL, NULL, NULL);
CDC* psrcDC = m_pWndPlay->GetDC();
CDC memDC;
//创建兼容的内存DC
//hMemDC = CreateCompatibleDC(hScrDC);
memDC.CreateCompatibleDC(psrcDC);
nX = lpRect.left;
nY = lpRect.top;
nX2 = lpRect.right;
nY2 = lpRect.bottom;
// 获得屏幕分辨率
xScrn = GetDeviceCaps(hScrDC, HORZRES);
yScrn = GetDeviceCaps(hScrDC, VERTRES);
nWidth = nX2 - nX;
nHeight = nY2 - nY;
// 创建兼容位图
bitmap.CreateCompatibleBitmap(psrcDC, nWidth, nHeight);
// 选入位图
oldbitmap = memDC.SelectObject(&bitmap);
// 拷贝
memDC.BitBlt(0, 0, nWidth, nHeight, psrcDC, nX, nY, SRCCOPY);
DeleteDC(hScrDC);
////////////////////////////////////////////////////////////////////////////////
// 以下内容为保存为文件的操作
////////////////////////////////////////////////////////////////////////////////
HDC hDC;
int iBits; //当前显示分辨率下每个像素所占字节数
WORD wBitCount;
DWORD dwPaletteSize = 0; //调色板大小
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;
else if (iBits <= 32)
wBitCount = 32;
//调色板的大小
if (wBitCount <= 8)
dwPaletteSize = (1 << wBitCount) * sizeof(RGBQUAD);
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
BITMAP Bitmap;
BITMAPINFOHEADER bi; //位图信息头结构
LPBITMAPINFOHEADER lpbi;
HANDLE hDib;
DWORD dwBmBitsSize;
//设置位图信息头
bitmap.GetBitmap(&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;
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
HPALETTE hPal, hOldPal = NULL;
// 调色板
hPal = (HPALETTE)GetStockObject(DEFAULT_PALETTE);
if (hPal)
{
hDC = ::GetDC(NULL);
hOldPal = ::SelectPalette(hDC, hPal, FALSE);
RealizePalette(hDC);
}
// 获取该调色板下新的像素值
::GetDIBits(hDC, (HBITMAP)bitmap, 0, (UINT) Bitmap.bmHeight,
(LPSTR)lpbi + sizeof(BITMAPINFOHEADER)+dwPaletteSize,
(BITMAPINFO *)lpbi, DIB_RGB_COLORS);
//恢复原来的调色板
if (hOldPal)
{
SelectPalette(hDC, hOldPal, TRUE);
RealizePalette(hDC);
::ReleaseDC(NULL, hDC);
}
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
HANDLE fh;
//创建位图文件
fh = CreateFile("c:\\scr.bmp", GENERIC_WRITE,
0, NULL, CREATE_ALWAYS,
FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN, NULL);
if (fh == INVALID_HANDLE_VALUE)
return ;
BITMAPFILEHEADER bmfHdr;
DWORD dwDIBSize, dwWritten;
// 位图文件头部
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);
Top




