学海无涯

记录我的程序人生...

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::
http://community.csdn.net/Expert/topic/3102/3102187.xml?temp=.8055536

using System ;
using System.Drawing ;
using System.Collections ;
using System.ComponentModel ;
using System.Windows.Forms ;
using System.Data ;
using System.Drawing.Imaging ;
using System.IO ;
  //导入在程序中使用到的名称空间
public class Capture : Form
{
 private System.ComponentModel.Container components = null ;
 private Icon mNetTrayIcon = new Icon ( "Tray.ico" ) ;
 private Bitmap MyImage = null ;
 private NotifyIcon TrayIcon ;
 private ContextMenu notifyiconMnu ;
 public Capture ( )
 {
  //初始化窗体中使用到的组件
  InitializeComponent ( ) ;
 }
 protected override void OnActivated ( EventArgs e )
 {
  this.Hide ( ) ;
 }
 [ System.Runtime.InteropServices.DllImportAttribute ( "gdi32.dll" ) ]
 private static extern bool BitBlt (
  IntPtr hdcDest , //目标设备的句柄
  int nXDest , // 目标对象的左上角的X坐标
  int nYDest , // 目标对象的左上角的X坐标
  int nWidth , // 目标对象的矩形的宽度
  int nHeight , // 目标对象的矩形的长度
  IntPtr hdcSrc , // 源设备的句柄
  int nXSrc , // 源对象的左上角的X坐标
  int nYSrc , // 源对象的左上角的X坐标
  System.Int32 dwRop // 光栅的操作值
  ) ;
 [ System.Runtime.InteropServices.DllImportAttribute ( "gdi32.dll" ) ]
 private static extern IntPtr CreateDC (
  string lpszDriver , // 驱动名称
  string lpszDevice , // 设备名称
  string lpszOutput , // 无用,可以设定位"NULL"
  IntPtr lpInitData // 任意的打印机数据
  ) ; 
 public void capture ( object sender , System.EventArgs e )
 {
  this.Visible = false ;
  IntPtr dc1 = CreateDC ( "DISPLAY" , null , null , ( IntPtr ) null ) ;
  //创建显示器的DC
  Graphics g1 = Graphics.FromHdc ( dc1 ) ;
  //由一个指定设备的句柄创建一个新的Graphics对象
  MyImage = new Bitmap ( Screen.PrimaryScreen.Bounds.Width , Screen.PrimaryScreen.Bounds.Height , g1 ) ;
  //根据屏幕大小创建一个与之相同大小的Bitmap对象
  Graphics g2 = Graphics.FromImage ( MyImage ) ;
  //获得屏幕的句柄
  IntPtr dc3 = g1.GetHdc ( ) ;
  //获得位图的句柄
  IntPtr dc2 = g2.GetHdc ( ) ;
  //把当前屏幕捕获到位图对象中
  BitBlt ( dc2 , 0 , 0 , Screen.PrimaryScreen.Bounds.Width , Screen.PrimaryScreen.Bounds.Height , dc3 , 0 , 0 , 13369376 ) ;
  //把当前屏幕拷贝到位图中
  g1.ReleaseHdc ( dc3 ) ;
  //释放屏幕句柄
  g2.ReleaseHdc ( dc2 ) ;
  //释放位图句柄
  MyImage.Save ( "c:\\MyJpeg.jpg" , ImageFormat.Jpeg ) ;
  MessageBox.Show ( "已经把当前屏幕保存到C:\\MyJpeg.jpg文件中!" ) ;
  this.Visible = true ;
 }
 public void ExitSelect ( object sender , System.EventArgs e )
 {
  //隐藏托盘程序中的图标
  TrayIcon.Visible = false ;
  //关闭系统
  this.Close ( ) ;
 }
 //清除程序中使用过的资源
 /*public override void Dispose( )
 {
  base.Dispose ( ) ;
  if ( components != null )
   components.Dispose ( ) ;
 } */
 private void InitializeComponent ( )
 {
  //设定托盘程序的各个属性
  TrayIcon = new NotifyIcon ( ) ;
  TrayIcon.Icon = mNetTrayIcon ;
  TrayIcon.Text = "用C#做Screen Capture程序" ;
  TrayIcon.Visible = true ;
  //定义一个MenuItem数组,并把此数组同时赋值给ContextMenu对象
  MenuItem [ ] mnuItms = new MenuItem [ 3 ] ;
  mnuItms [ 0 ] = new MenuItem ( ) ;
  mnuItms [ 0 ] .Text = "捕获当前屏幕!" ;
  mnuItms [ 0 ] .Click += new System.EventHandler ( this.capture ) ;
  mnuItms [ 1 ] = new MenuItem ( "-" ) ;
  mnuItms [ 2 ] = new MenuItem ( ) ;
  mnuItms [ 2 ] .Text = "退出系统" ;
  mnuItms [ 2 ] .Click += new System.EventHandler ( this.ExitSelect ) ;
  mnuItms [ 2 ] .DefaultItem = true ;
  notifyiconMnu = new ContextMenu ( mnuItms ) ;
  TrayIcon.ContextMenu = notifyiconMnu ;
  //为托盘程序加入设定好的ContextMenu对象
  this.SuspendLayout ( ) ;
  this.AutoScaleBaseSize = new System.Drawing.Size ( 5 , 13 ) ;
  this.ClientSize = new System.Drawing.Size ( 320 , 56 ) ;
  this.ControlBox = false ;
  this.MaximizeBox = false ;
  this.MinimizeBox = false ;
  this.WindowState = System.Windows.Forms.FormWindowState.Minimized ;
  this.Name = "capture" ;
  this.ShowInTaskbar = false ;
  this.Text = "用C#做Screen Capture程序!" ;
  this.ResumeLayout ( false ) ;
 }
 static void Main ( )
 {
  Application.Run ( new Capture ( ) ) ;
 }
}
posted on 2004-06-18 09:55  josson  阅读(1601)  评论(0编辑  收藏  举报