C#截取屏幕↑

原创 2004年07月05日 15:01:00

今天无聊翻代码,翻出来一个以前写的C#截屏的函数...拿出来和大家共享一下.
这段代码是参照网上一段截屏的C++代码改写的.只不过把API都声明了一下而已.
声明的各API也附后.以供参照.如有问题欢迎指出.(Appledotnet@hotmail.com)

 

 

///
/// 截取部分屏幕
///
/// 左上角
/// 右下角
/// 是否全屏幕
/// 返回值Bitmap
public static Bitmap GetPartScreen(Point P1,Point P2,bool Full)
{
    IntPtr hscrdc,hmemdc;
    IntPtr hbitmap,holdbitmap;
    int nx,ny,nx2,ny2;
    nx=ny=nx2=ny2=0;
    int nwidth, nheight;
    int xscrn, yscrn;
    hscrdc = CreateDC("DISPLAY", null, null, 0);//创建DC句柄
    hmemdc = CreateCompatibleDC(hscrdc);//创建一个内存DC
    xscrn = GetDeviceCaps(hscrdc, GetDeviceCapsIndex.HORZRES);//获取屏幕宽度
    yscrn = GetDeviceCaps(hscrdc, GetDeviceCapsIndex.VERTRES);//获取屏幕高度
    if(Full)//如果是截取整个屏幕
    {
        nx = 0;
        ny = 0;
        nx2 = xscrn;
        ny2 = yscrn;
    }
    else
    {
        nx = P1.X;
        ny = P1.Y;
        nx2 =P2.X;
        ny2 =P2.Y;
        //检查数值合法性
        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);//从内存DC复制到hbitmap句柄
    holdbitmap = SelectObject(hmemdc, hbitmap);
    BitBlt(hmemdc, 0, 0, nwidth, nheight,hscrdc, nx, ny,(UInt32)0xcc0020);
    hbitmap = SelectObject(hmemdc, holdbitmap);
    DeleteDC(hscrdc);//删除用过的对象
    DeleteDC(hmemdc);//删除用过的对象
    return Bitmap.FromHbitmap(hbitmap);//用Bitmap.FromHbitmap从hbitmap返回Bitmap
}

 

 

 

所用到的API声明:

[DllImport("gdi32.dll")]
public static extern IntPtr CreateDC(
 string lpszDriver,        // driver name
 string lpszDevice,        // device name
 string lpszOutput,        // not used; should be NULL
 UInt32 lpInitData  // optional printer data
 );
 
[DllImport("gdi32.dll")]
public static extern IntPtr CreateCompatibleDC(
 IntPtr hdc // handle to DC
 );
 
[DllImport("gdi32.dll")]
public static extern int GetDeviceCaps(
 IntPtr hdc,     // handle to DC
 GetDeviceCapsIndex nIndex   // index of capability
);

[DllImport("gdi32.dll")]
public static extern IntPtr CreateCompatibleBitmap(
 IntPtr hdc,        // handle to DC
 int nWidth,     // width of bitmap, in pixels
 int nHeight     // height of bitmap, in pixels
 );

[DllImport("gdi32.dll")]
public static extern IntPtr SelectObject(
 IntPtr hdc,          // handle to DC
 IntPtr hgdiobj   // handle to object
 );

[DllImport("gdi32.dll")]
public static extern int BitBlt(
 IntPtr hdcDest, // handle to destination DC
 int nXDest,  // x-coord of destination upper-left corner
 int nYDest,  // y-coord of destination upper-left corner
 int nWidth,  // width of destination rectangle
 int nHeight, // height of destination rectangle
 IntPtr hdcSrc,  // handle to source DC
 int nXSrc,   // x-coordinate of source upper-left corner
 int nYSrc,   // y-coordinate of source upper-left corner
 UInt32 dwRop  // raster operation code
 );

[DllImport("gdi32.dll")]
public static extern int DeleteDC(
 IntPtr hdc          // handle to DC
 );

/// <summary>
  /// GetDeviceCaps使用的枚举
  /// </summary>
  [Flags()]
  public enum GetDeviceCapsIndex
  {
   /// <summary>
   /// 设备的版本
   /// </summary>
   DRIVERVERSION=0,
   TECHNOLOGY=2,
   HORZSIZE=4,
   VERTSIZE=6,
   /// <summary>
   /// 屏幕宽度
   /// </summary>
   HORZRES=8,
   /// <summary>
   /// 屏幕高度
   /// </summary>
   VERTRES=10,
   LOGPIXELSX=88,
   LOGPIXELSY=90,
   BITSPIXEL=12,
   PLANES=14,
   NUMBRUSHES=16,
   NUMPENS=18,
   NUMFONTS=22,
   NUMCOLORS=24,
   ASPECTX=40,
   ASPECTY=42,
   ASPECTXY=44,
   PDEVICESIZE=26,
   CLIPCAPS=36,
   SIZEPALETTE=104,
   NUMRESERVED=106,
   COLORRES=108,
   /// <summary>
   /// 设备宽度???
   /// </summary>
   PHYSICALWIDTH=110,
   /// <summary>
   /// 设备高度???
   /// </summary>
   PHYSICALHEIGHT=111,
   PHYSICALOFFSETX=112,
   PHYSICALOFFSETY=113,
   VREFRESH=116,
   SCALINGFACTORX=114,
   SCALINGFACTORY=115,
   BLTALIGNMENT=119,
  }

截取屏幕生成GIF

呃,一直想有一个这样功能的软件,但是貌似木有找到啊。 于是自己写了一个比较挫的。。 思路,截取ForegroundWindow图像生成png void SavePictureAsPng(LPCTS...
  • linlin003
  • linlin003
  • 2016年05月10日 14:02
  • 681

Android 截取手机屏幕两种实现方案解析

最近在开发的过程中,遇到了一个需要截取屏幕保存为图片的需求,具体为截取webview的视图保存图片。 方法1:首先想到的思路是利用SDK提供的View.getDrawingCache()方法 ...
  • turays
  • turays
  • 2017年04月24日 09:53
  • 595

C#实现屏幕录制

以前写过两篇录制麦克风语音和摄像头视频的文章,最近有朋友问,如果要实现屏幕录制这样的功能,该怎么做了?...
  • zhuweisky
  • zhuweisky
  • 2014年03月11日 15:51
  • 4324

QT截取屏幕的实现

原文地址::http://blog.csdn.net/pamxy/article/details/9793883 相关文章 1、qt实现截取屏幕----http://blog.csdn.net/y...
  • xqhrs232
  • xqhrs232
  • 2016年10月09日 15:54
  • 227

C++截取整个屏幕,并生成图片(基于MFC)

第一步:建立Windows 32控制台控制程序 第二部:设置工程的属性如下:MFC的使用 --> 在共享 DLL 中使用 MFC stdafx.h #pr...
  • JUST_DO_1122
  • JUST_DO_1122
  • 2016年09月20日 15:58
  • 1281

js使用html2canvas实现屏幕截取

js使用html2canvas实现屏幕截取
  • q36835109
  • q36835109
  • 2017年04月28日 16:10
  • 1988

安卓开发截取当前屏幕图片及截取整个ListView图片并保存到本地

安卓开发截取当前屏幕图片及截取整个ListView图片并保存到本地package com.hsg.myrefresh.util;import android.app.Activity; import ...
  • zhou_anzhuojinjie
  • zhou_anzhuojinjie
  • 2017年02月22日 09:51
  • 1186

C#软件开发实例.私人订制自己的屏幕截图工具(十)在截图中包含鼠标指针形状

在写一此帮助说明类的文档时,截取的图片如果还有鼠标的指针形状,看起来就更直观更友好一些。接下来就讲一下如何在截图中包含鼠标指针形状。上一篇:C#软件开发实例.私人订制自己的屏幕截图工具(九)使用自定义...
  • testcs_dn
  • testcs_dn
  • 2014年06月21日 23:14
  • 5846

利用MFC截取对话框图像或者截取全屏图像

可能用到的库: #include #include 在下面的程序里,我构造一个CDialog对话框,点击它的OK按钮之后,程序进行截取保存工作。全屏图像保存到test2.bmp文件里。...
  • liji_digital
  • liji_digital
  • 2017年04月13日 22:10
  • 767

【框架-MFC】截取整个屏幕,伪造桌面

//1、设置窗口属性 // “Border - None”、“Application Window - False”、“Tool Window - True” //2、在CWinApp中添加一个存放...
  • chenlu5201314
  • chenlu5201314
  • 2016年05月06日 15:09
  • 558
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C#截取屏幕↑
举报原因:
原因补充:

(最多只允许输入30个字)