C#模拟QQ截屏功能

原创 2007年09月19日 11:55:00

可以利用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(00);  //鼠标第一点
        public Point secondPoint = new Point(00);  //鼠标第二点
        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(00), new Point(00), 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() + ") ";
                msg.Text 
+= "右下角坐标:(" + maxX.ToString() + "," + maxY.ToString() + ") ";
                msg.Text 
+= "截图大小:" + (maxX - minX) + "×" + (maxY - minY) + " ";
                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();
        }


    }

}

C#模拟QQ截屏功能

  • 2007年07月29日 19:07
  • 38KB
  • 下载

模拟QQ截屏效果。

模拟QQ截屏效果。 http://blog.csdn.net/laviewpbt/article/details/1370783        QQ确实太占资源了, 物理内存和虚拟内存...

VB模拟QQ截屏源码

  • 2011年05月14日 19:21
  • 64KB
  • 下载

VB6模拟QQ截屏源码

  • 2015年03月24日 15:29
  • 72KB
  • 下载

java swing 基本实现QQ截屏功能,很简陋但有学习价值

CpFrame.java  ,CaptureScreenhh.java和icon.png CpFrame.java package captuhhhhh; import java.awt...

最新VB模拟QQ截屏

  • 2009年06月25日 13:26
  • 64KB
  • 下载

很强大的类似QQ截屏功能的软件

  • 2010年01月02日 10:53
  • 255KB
  • 下载

Java学习笔记之 swing 基本实现QQ截屏功能

CpFrame.java  ,CaptureScreenhh.java和icon.png CpFrame.java package captuhhhhh; import java.awt.R...
  • SJF0115
  • SJF0115
  • 2011年12月10日 12:23
  • 1568

类似QQ截屏功能的软件

  • 2009年12月23日 21:14
  • 165KB
  • 下载

c#实现qq截屏功能.chm

  • 2008年10月18日 16:16
  • 62KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C#模拟QQ截屏功能
举报原因:
原因补充:

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