C#模拟QQ截屏功能 (转)
来源:互联网 发布:呱呱财经软件下载 编辑:程序博客网 时间:2024/04/29 11:50
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(0, 0), new Point(0, 0), 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(); } }} 界面如下:
- C#模拟QQ截屏功能 (转)
- C#模拟QQ截屏功能 (转)
- C#模拟QQ截屏功能
- C#模拟QQ截屏功能
- C#模拟QQ截屏功能
- VC 模拟QQ闪屏功能
- \t\tVC 模拟QQ闪屏功能
- ”QQ尾巴“功能模拟
- 模拟QQ截屏效果。
- 用Delphi模拟QQ窗体伸缩功能
- 用Delphi模拟QQ窗体伸缩功能
- 模拟QQ图像自定义剪裁功能
- 多线程通信之模拟QQ聊天功能
- (转)模拟QQ截屏
- 用Java模拟出QQ桌面截图功能(未测试)
- 3.2.5.2 模拟C函数 scanf()功能
- Android自定义截屏功能,类似QQ截屏
- C#模拟QQ截图(转)
- 设置取消自动Build
- 使用tcgetattr函数与tcsetattr函数控制终端
- (转)高效屏幕录制
- Test SQL
- java 读取文件
- C#模拟QQ截屏功能 (转)
- 在视图上建立触发器的方法详解
- php $_FILES详解
- VC编码技巧
- Linux上shmmax参数的设置及含义
- 如何理解.net中的垃圾回收机制
- 433434
- oracle笔记
- 文章中引用参数和return参数的用法