CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
不看会后悔的Windows XP之经验谈 简单快捷DIY实用家庭影院
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  VC/MFC >  基础类

怎样对桌面截图?

楼主gothing()2002-06-24 13:13:29 在 VC/MFC / 基础类 提问

怎样对桌面截图,即如何把桌面的内容保存成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

相关问题

  • 桌面截图,黑客程序所致??
  • 怎么样让桌面静止,好抓取控件截图?
  • 在ASP.NET中怎样截图?
  • 怎样取得窗体相对与桌面的坐标???
  • 求教:怎样才能对AVI图像的局部区域截图
  • 怎样显示桌面?
  • 怎样隐藏桌面?
  • 请问,怎样屏幕截图?
  • 用C#怎样实现屏幕截图
  • 怎样做到获得对桌面弹出菜单的控制权?!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!1

关键词

  • 桌面
  • 组件
  • 拷贝
  • 屏幕
  • 代码
  • 函数
  • top
  • 窗体
  • pwndplay
  • hscrdc

得分解答快速导航

  • 帖主:gothing
  • DavidWhite
  • fhbkyo
  • spwnihao

相关链接

  • Visual C++类图书
  • Visual C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo