C#模拟QQ截屏功能

可以利用Graphics类的CopyFromScreen方法来实现屏幕截取,舍弃了比较麻烦的API函数,只要几句代码就能实现了,而且这个这个方法能实现只抓取部分区域的屏幕,可以实现类似qq抓屏的功能。

using  System;
using  System.Collections.Generic;
using  System.Text;
using  System.Drawing;
using  System.Drawing.Imaging;
using  System.Windows.Forms;

namespace  ConsoleApplication1
... {
    
class Program
    
...{
        
static void Main(string[] args)
        
...{
                //获得当前屏幕的分辨率
            Screen scr 
= Screen.PrimaryScreen;
            Rectangle rc 
= scr.Bounds;
            
int iWidth = rc.Width;  
            int iHeight = rc.Height;
                //创建一个和屏幕一样大的Bitmap
            Image myImage 
= new Bitmap(iWidth, iHeight);
                //从一个继承自Image类的对象中创建Graphics对象
            Graphics g = Graphics.FromImage(myImage);
                //抓屏并拷贝到myimage里
            g.CopyFromScreen(
new Point(00), new Point(00), new Size(iWidth, iHeight));
                //保存为文件
            myImage.Save(
@"c:/1.jpeg");

        }


    }

}
 

以上内容转自lijgame的blog,在此对作者表示感谢!
原文地址: http://blog.csdn.net/lijgame/archive/2006/12/18/1447921.aspx

现在就文中的“实现QQ截屏”功能继续研究如下。


1、首先要实现在屏幕上画图,即:可以在屏幕上画出一个矩形框,双击该矩形框将截取矩形框内的屏幕。

目前在屏幕上画图的C#实现代码如下:

[DllImport( " User32.dll " )]
        
public   extern   static  System.IntPtr GetDC(System.IntPtr hWnd);   

        
private   void  button19_Click( object  sender, EventArgs e)
        {
            System.IntPtr   DesktopHandle   
=    GetDC(System.IntPtr.Zero);
            Graphics g 
=  Graphics.FromHdc(DesktopHandle);
            g.DrawRectangle(
new  Pen(Color.Red), new  Rectangle( 10 , 10 , 100 , 100 ));
        }

需要用到可恶的API,实在不想用这种方法来实现!

2、研究出QQ屏幕上画图的真相

继续研究QQ截图的功能,发现当点击“截图”按钮之后,屏幕变成静止的了,原先网页上跳动的东西都不动了,哈哈,原因很简单,QQ截取了整个屏幕,然后用这张静止的屏幕覆盖全屏,真是精妙的解决办法啊!
 
于是用C#实现是:
建一个子窗体ScreenForm ,在窗体上放一个pictureBox和一个label控件。ScreenForm代码如下:

using  System;
using  System.Collections.Generic;
using  System.ComponentModel;
using  System.Data;
using  System.Drawing;
using  System.Text;
using  System.Windows.Forms;

namespace  copyScreen
{

    
public  partial  class  ScreenForm : Form
    {
        
public  ScreenForm()
        {
            InitializeComponent();
        }

        
public   event  copyToFatherTextBox copytoFather;   // 截屏完毕后交个父窗体处理截图
         public   bool  begin  =   false ;    // 是否开始截屏
         public   bool  isDoubleClick  =   false ;
        
public  Point firstPoint  =   new  Point( 0 0 );   // 鼠标第一点
         public  Point secondPoint  =   new  Point( 0 0 );   // 鼠标第二点
         public  Image cachImage  =   null ;   // 用来缓存截获的屏幕
         public   int  halfWidth  =   0 ; // 保存屏幕一半的宽度
         public   int  halfHeight  =   0 ; // 保存屏幕一般的高度

        
/* 复制整个屏幕,并让窗体填充屏幕 */
        
public   void  copyScreen()
        {
            Rectangle r 
=  Screen.PrimaryScreen.Bounds;
            Image img 
=   new  Bitmap(r.Width, r.Height);
            Graphics g 
=  Graphics.FromImage(img);
            g.CopyFromScreen(
new  Point( 0 0 ),  new  Point( 0 0 ), r.Size);

            
// 窗体最大化,及相关处理
             this .Width  =  r.Width;
            
this .Height  =  r.Height;
            
this .Left  =   0 ;
            
this .Top  =   0 ;
            pictureBox1.Width 
=  r.Width;
            pictureBox1.Height 
=  r.Height;
            pictureBox1.BackgroundImage 
=  img;
            cachImage 
=  img;
            halfWidth 
=  r.Width  /   2 ;
            halfHeight 
=  r.Height  /   2 ;
            
this .Cursor  =   new  Cursor(GetType(),  " MyCursor.cur " );  
        }

        
private   void  ScreenForm_Load( object  sender, EventArgs e)
        {
            copyScreen();
        }

        
/* 鼠标按下时开始截图 */
        
private   void  pictureBox1_MouseDown( object  sender, MouseEventArgs e)
        {
            
if ( ! isDoubleClick)
            {
                begin 
=   true ;
                firstPoint 
=   new  Point(e.X, e.Y);
                changePoint(e.X, e.Y);
                msg.Visible 
=   true ;
            }
        }
        
/* 鼠标移动时显示截取区域的边框 */
        
private   void  pictureBox1_MouseMove( object  sender, MouseEventArgs e)
        {
            
if  (begin)
            {
                
// 获取新的右下角坐标
                secondPoint  =   new  Point(e.X, e.Y);
                
int  minX  =  Math.Min(firstPoint.X, secondPoint.X);
                
int  minY  =  Math.Min(firstPoint.Y, secondPoint.Y);
                
int  maxX  =  Math.Max(firstPoint.X, secondPoint.X);
                
int  maxY  =  Math.Max(firstPoint.Y, secondPoint.Y);

                
// 重新画背景图
                Image tempimage  =   new  Bitmap(cachImage);
                Graphics g 
=  Graphics.FromImage(tempimage);
                
// 画裁剪框
                g.DrawRectangle( new  Pen(Color.Red),minX,minY,maxX - minX,maxY - minY);
                pictureBox1.Image 
=  tempimage;
                
// 计算坐标信息
                msg.Text  =   " 左上角坐标:( "   +  minX.ToString()  +   " , "   +  minY.ToString()  +   " )\r\n " ;
                msg.Text 
+=   " 右下角坐标:( "   +  maxX.ToString()  +   " , "   +  maxY.ToString()  +   " )\r\n " ;
                msg.Text 
+=   " 截图大小: "   +  (maxX  -  minX)  +   " × "   +  (maxY  -  minY)  +   " \r\n " ;
                msg.Text 
+=   " 双击任意地方结束截屏! " ;
                changePoint((minX 
+  maxX)  /   2 , (minY  +  maxY)  /   2 );
            }
        }
        
/* 动态调整显示信息的位置,输入参数为当前截屏鼠标位置 */
        
public   void  changePoint( int  x,  int  y)
        {
            
if  (x  <  halfWidth)
            {
                
if  (y  <  halfHeight)
                { msg.Top 
=  halfHeight; msg.Left  =  halfWidth; }
                
else
                { msg.Top 
=   0 ; msg.Left  =  halfWidth; }
            }
            
else
            {
                
if  (y  <  halfHeight)
                { msg.Top 
=  halfHeight; msg.Left  =   0 ; }
                
else
                { msg.Top 
=   0 ; msg.Left  =   0 ; }
            }
        }

        
/* 鼠标放开时截图操作完成 */
        
private   void  pictureBox1_MouseUp( object  sender, MouseEventArgs e)
        {
            begin 
=   false ;
            isDoubleClick 
=   true // 之后再点击就是双击事件了
        }
        
/* 双击时截图时,通知父窗体完成截图操作,同时关闭本窗体 */
        
private   void  pictureBox1_DoubleClick( object  sender, EventArgs e)
        {
            
if  (firstPoint  !=  secondPoint)
            {
                
int  minX  =  Math.Min(firstPoint.X, secondPoint.X);
                
int  minY  =  Math.Min(firstPoint.Y, secondPoint.Y);
                
int  maxX  =  Math.Max(firstPoint.X, secondPoint.X);
                
int  maxY  =  Math.Max(firstPoint.Y, secondPoint.Y);
                Rectangle r 
=   new  Rectangle(minX, minY, maxX  -  minX, maxY  -  minY);
                copytoFather(r);
            }
            
this .Close();
            
// msg.Text = r.ToString();
        }

    }
}

界面如下:





本程序下载:  CODE           演示版: Demo
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值