怎么选框截图

时间:2021-11-11 05:55:29 200字

篇一:《C#鼠标选择框截图代码》

截图代码

Posted on 2007-07-16 13:02 小y 阅读(6925) 评论(20)

编辑 收藏

可以利用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,在此对作者表示感谢!

原文地址:

现在就文中的“实现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

() + ")rn";

msg.Text += "右下角坐标:(" + maxX.ToString() + "," + maxY.ToString

() + ")rn";

msg.Text += "截图大小:" + (maxX - minX) + "×" + (maxY - minY) + "rn";{怎么选框截图}.

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();

}

}

}

界面如下:

篇二:《教你怎样电脑抓图 截图》

教你怎样抓图 电脑巧门 2008-09-24 18:27:54 阅读97176 评论12 字号:大中小 订阅

篇三:《C#做的一个qq截图的自动框选功能12.10》

源码地址:

博客地址:

Hook部分的代码:

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Diagnostics;

using System.Runtime.InteropServices;

namespace AutoDrawRect

{

public class MouseHook

{

//好吧这个没有用到

private bool isSet;

public bool IsSet {

get { return isSet; }

}

//这个也没有用到

private int handleOfHook;

public int HandleOfHook {

get { return handleOfHook; }{怎么选框截图}.

}

//这个还是没有用到、、、淡定!

private bool isStopMsg;

public bool IsStopMsg {

get { return isStopMsg; }

set { isStopMsg = value; }

}

//自己定义了一个事件 放到Hook里面去

public delegate void MEventhandler(object sender, MouseInfoEventArys e);

public event MEventhandler HooKMouseEvent;

[DllImport("user32.dll")]//设置钩子 第二个参数为回调函数指针 public static extern int SetWindowsHookEx(int idHook, HookProc lpfn, IntPtr hmod, int dwThreadid);

[DllImport("user32.dll")]//传递到下一个钩子

public static extern int CallNextHookEx(int hHook, int nCode, IntPtr wParam, IntPtr lParam);

[DllImport("user32.dll")]//卸载钩子

public static extern bool UnhookWindowsHookEx(int hHook);

[DllImport("kernel32.dll")]//获取模块句柄{怎么选框截图}.

public static extern IntPtr GetModuleHandle(string lpModuleName);

public const int WH_MOUSE_LL = 14;//全局鼠标Hook 7是局部的 13全局键盘 2局部键盘

public delegate int HookProc(int nCode, IntPtr wParam, IntPtr lParam);//话说c#里面委托就是函数指针?、

private const int WM_LBUTTONDOWN = 0x201; //在Hook里面判断是否左键点下

private const int WM_RBUTTONUP = 0x205; //在Hook里面判断是否右键抬起