winform实现矩形框截图
使用方法如下:

private void button1_Click(object sender, EventArgs e)
{
s.GerScreenFormRectangle(); }
private Zgke.CopyScreen s;
private void Form1_Load(object sender, EventArgs e)
{
s = new Zgke.CopyScreen();
s.GetScreenImage+=new Zgke.CopyScreen.GetImage(s_GetScreenImage);
} void s_GetScreenImage(Image p_Image)
{
pictureBox1.Image = p_Image;
}

当按下BUTTON1的时候可以在屏幕上选择一个矩形进行截图
全部的类
先建立个新项目 为WINDOWS库类.这里因为需要全局钩子..我在WINFORM里不知道为什么设置不了全局钩子.但在DLL里就可以.....可恶的C#........
复制下面代码到CLASS1.CS里

using System;
using System.Collections.Generic;
using System.Text;
using System.Runtime.InteropServices;
using System.Drawing;
using System.Windows.Forms; namespace Zgke
{
public class API
{
[DllImport("user32.dll", CharSet = CharSet.Auto)]
public static extern IntPtr GetDesktopWindow(); [DllImport("user32.dll", CharSet = CharSet.Auto)]
public static extern IntPtr SetWindowsHookEx(int hookid, HookProc pfnhook, IntPtr hinst, int threadid); public delegate IntPtr HookProc(int nCode, IntPtr wParam, IntPtr lParam); [DllImport("kernel32.dll", ExactSpelling = true, CharSet = CharSet.Auto)]
public static extern int GetCurrentThreadId(); [DllImport("user32.dll", CharSet = CharSet.Auto, ExactSpelling = true)]
public static extern bool UnhookWindowsHookEx(IntPtr hhook); public enum WindowsHookCodes
{
WH_MSGFILTER = (-1),
WH_JOURNALRECORD = 0,
WH_JOURNALPLAYBACK = 1,
WH_KEYBOARD = 2,
WH_GETMESSAGE = 3,
WH_CALLWNDPROC = 4,
WH_CBT = 5,
WH_SYSMSGFILTER = 6,
WH_MOUSE = 7,
WH_HARDWARE = 8,
WH_DEBUG = 9,
WH_SHELL = 10,
WH_FOREGROUNDIDLE = 11,
WH_CALLWNDPROCRET = 12,
WH_KEYBOARD_LL = 13,
WH_MOUSE_LL = 14
} } /// <summary>
/// 一个根据矩形截图类
/// zgke@Sina.com
/// qq:116149
/// </summary>
public class CopyScreen
{
/// <summary>
/// 屏幕大小
/// </summary>
private Size ScreenSize { get { return Screen.PrimaryScreen.Bounds.Size; } }
/// <summary>
/// 鼠标位置
/// </summary>
private Point MousePoint { get { return Cursor.Position; } }
/// <summary>
/// 私有方法获取屏幕图形(全部图形)
/// </summary>
public Bitmap ScreenImage
{
get
{
Bitmap m_BackBitmap = new Bitmap(ScreenSize.Width, ScreenSize.Height);
Graphics _Graphics = Graphics.FromImage(m_BackBitmap);
_Graphics.CopyFromScreen(new Point(0, 0), new Point(0, 0), ScreenSize);
_Graphics.Dispose();
return m_BackBitmap;
}
}
/// <summary>
/// 钩子
/// </summary>
private HookMessage m_HookMessage;
/// <summary>
/// 屏幕句柄
/// </summary>
private IntPtr m_ScreenForm;
/// <summary>
/// 图形
/// </summary>
private Bitmap m_Image; public delegate void GetImage(Image p_Image);
/// <summary>
/// 获取屏幕截图
/// </summary>
public event GetImage GetScreenImage; /// <summary>
/// 构造
/// </summary>
public CopyScreen()
{
m_ScreenForm = API.GetDesktopWindow();
m_HookMessage = new HookMessage(API.WindowsHookCodes.WH_MOUSE_LL, true);
m_HookMessage.GetHook += new HookMessage.GetHookMessage(m_HookMessage_GetHook);
} /// <summary>
/// 钩子事件
/// </summary>
/// <param name="p_Code"></param>
/// <param name="p_wParam"></param>
/// <param name="p_lParam"></param>
/// <param name="p_Send"></param>
void m_HookMessage_GetHook(int p_Code, IntPtr p_wParam, IntPtr p_lParam, ref bool p_Send)
{
if (m_StarMouse)
{
switch (p_wParam.ToInt32())
{
case 512: //Move
MouseMove();
break;
case 513: //Down
MouseDown();
p_Send = false;
break;
case 514: //Up
MouseUp();
p_Send = false;
break;
default:
m_StarMouse = false;
break;
}
}
} /// <summary>
/// 根据矩形 如果Width是正直接返回 如果使-会转换成正的矩形 保证大小位置不变
/// </summary>
/// <param name="p_Rectangle">矩形</param>
/// <returns>正矩形</returns>
public static Rectangle GetUprightRectangle(Rectangle p_Rectangle)
{
Rectangle _Rect = p_Rectangle;
if (_Rect.Width < 0)
{
int _X = _Rect.X;
_Rect.X = _Rect.Width + _Rect.X;
_Rect.Width = _X - _Rect.X;
}
if (_Rect.Height < 0)
{
int _Y = _Rect.Y;
_Rect.Y = _Rect.Height + _Rect.Y;
_Rect.Height = _Y - _Rect.Y;
}
return _Rect;
} private Rectangle m_MouseRectangle = new Rectangle(0, 0, 0, 0);
private bool m_DrawStar = false;
private void MouseDown()
{
m_MouseRectangle.X = MousePoint.X;
m_MouseRectangle.Y = MousePoint.Y;
m_DrawStar = true;
}
private void MouseMove()
{
if (m_DrawStar)
{
ControlPaint.DrawReversibleFrame(m_MouseRectangle, Color.Transparent, FrameStyle.Dashed);
m_MouseRectangle.Width = MousePoint.X - m_MouseRectangle.X;
m_MouseRectangle.Height = MousePoint.Y - m_MouseRectangle.Y;
ControlPaint.DrawReversibleFrame(m_MouseRectangle, Color.White, FrameStyle.Dashed); }
}
private void MouseUp()
{
ControlPaint.DrawReversibleFrame(m_MouseRectangle, Color.Transparent, FrameStyle.Dashed);
m_DrawStar = false;
m_StarMouse = false;
Rectangle _ScreenRectangle = GetUprightRectangle(m_MouseRectangle);
m_MouseRectangle.X = 0;
m_MouseRectangle.Y = 0;
m_MouseRectangle.Width = 0;
m_MouseRectangle.Height = 0;
if (GetScreenImage != null)
{
if (_ScreenRectangle.Width != 0 && _ScreenRectangle.Height != 0) GetScreenImage(m_Image.Clone(_ScreenRectangle, m_Image.PixelFormat));
}
}
private bool m_StarMouse = false; /// <summary>
/// 获取图形
/// </summary>
public void GerScreenFormRectangle()
{
m_Image = ScreenImage;
m_StarMouse = true;
} /// <summary>
/// 获取图形
/// </summary>
public void GetScreen()
{
if (GetScreenImage != null) GetScreenImage(ScreenImage);
} } /// <summary>
/// 用钩子获取消息
/// zgke@Sina.com
/// </summary>
public class HookMessage
{
private IntPtr m_HookEx;
/// <summary>
/// 设置自己进程的钩子
/// </summary>
/// <param name="p_HookCodes">钩子类型</param>
public HookMessage(API.WindowsHookCodes p_HookCodes)
{
m_HookEx = API.SetWindowsHookEx((int)p_HookCodes, new API.HookProc(SetHookProc), IntPtr.Zero, API.GetCurrentThreadId());
}
/// <summary>
/// 设置进程的钩子
/// </summary>
/// <param name="p_HookCodes">钩子类型</param>
/// <param name="p_ThreadID">全局钩子</param>
public HookMessage(API.WindowsHookCodes p_HookCodes, bool p_Zero)
{
IntPtr _Value = System.Runtime.InteropServices.Marshal.GetHINSTANCE(System.Reflection.Assembly.GetExecutingAssembly().GetModules()[0]);
m_HookEx = API.SetWindowsHookEx((int)p_HookCodes, new API.HookProc(SetHookProc), _Value, 0);
}
/// <summary>
/// 关闭钩子
/// </summary>
public void UnHookMessage()
{
if (API.UnhookWindowsHookEx(m_HookEx))
{
m_HookEx = IntPtr.Zero;
}
} public delegate void GetHookMessage(int p_Code, IntPtr p_wParam, IntPtr p_lParam, ref bool p_Send);
public event GetHookMessage GetHook; private IntPtr SetHookProc(int p_Code, IntPtr p_wParam, IntPtr p_lParam)
{
GC.Collect();
GC.WaitForPendingFinalizers();
GC.Collect();
bool _SendMessage = true;
if (GetHook != null) GetHook(p_Code, p_wParam, p_lParam, ref _SendMessage);
if (!_SendMessage) return new IntPtr(1);
return IntPtr.Zero;
}
}
}

在其他项目里引用这个项目就好了
winform实现矩形框截图的更多相关文章
- C# GDI绘制矩形框,鼠标左键拖动可移动矩形框,滚轮放大缩小矩形框
最近工作需要,要做一个矩形框,并且 用鼠标左键拖动矩形框移动其位置.网上查了一些感觉他们做的挺复杂的.我自己研究一天,做了一个比较简单的,发表出来供大家参考一下.如觉得简单,可路过,谢谢.哈哈. 先大 ...
- 【python】PIL 批量绘制图片矩形框工具
工具采用PIL:Python Imaging Library,图像处理标准库.PIL功能非常强大,但API却非常简单易用. 安装PIL 在Debian/Ubuntu Linux下直接通过apt安装 $ ...
- 如何用 matlab 在图片上绘制矩形框 和 添加文字 ?
如何给图像添加矩形框?以及添加想要输入的文字 ? 案例程序,如下所示: clc; close all; clear all;image = imread('/home/wangxiao/Picture ...
- Winform 下拉框绑定问题
在Winform中下拉框绑定的时候只能读到text属性值,Id的值不管怎么搞都读取不到,所以就百度找到了一种方式: public void CmdBind() { var data = _logic. ...
- Android摄像头:只拍摄SurfaceView预览界面特定区域内容(矩形框)---完整(原理:底层SurfaceView+上层绘制ImageView)
Android摄像头:只拍摄SurfaceView预览界面特定区域内容(矩形框)---完整实现(原理:底层SurfaceView+上层绘制ImageView) 分类: Android开发 Androi ...
- c#在pictureBox控件上绘制多个矩形框及删除绘制的矩形框
在pictureBox上每次只绘制一个矩形框,绘制下一个矩形框时上次绘制的矩形框取消,代码如链接:https://www.cnblogs.com/luxiao/p/5625196.html 在绘制矩形 ...
- WPF 矩形框8个控制点伸缩及拖拽
最近在研发图片控件矩形框8个控制点进行控制边框的大小.位置等信息,之前查阅了相关的信息,比如别人整合的类:ControlResizer 这个类虽然是好,但是很大程度上是有限制,换句话说,它需要你二次更 ...
- Torch 两个矩形框重叠面积的计算 (IoU between tow bounding box)
Torch 两个矩形框重叠面积的计算 (IoU between tow bounding box) function DecideOberlap(BBox_x1, BBox_y1, BBox_x2, ...
- GreenOpenPaint的实现(五)矩形框
想显示一副图片相对来说比较容易.但是想在SDI中显示一个可以拖拽的矩形框,并且在滚动和缩放下都不变形,是很困难的. MFC应该说在这个方面提供了强大的支持,但是也有一些是由于历史的原因需要去除的地方, ...
随机推荐
- Malware Defender(HIPS主动防御软件) V2.8 免费版
软件名称: Malware Defender(HIPS主动防御软件) V2.8 免费版 软件语言: 简体中文 授权方式: 免费软件 运行环境: Win7 / Vista / Win2003 / Win ...
- Unity3DGUI:鼠标click
Input函数监测鼠标操作 鼠标点击事件 鼠标双击事件
- Ajax.BeginForm无法调用 ajaxOptions的js函数
使用ajax.beginForm无法调用ajaxOptions的js函数的原因,一般都是缺少以下2个JS文件: 1,Install-Package jQuery –version 1.10.22,In ...
- Gs_Class._BaseQueryWeb查询页面基类(aspx.net)
using System;using System.Data;using System.Configuration;using System.Collections;using System.Web; ...
- string 数字序列大小比较
string 数字序列大小比较 string.compare string a = "022"; string b="1"; 比较结果 '022' < ' ...
- 利用python 与 wmi 获取WINDOWS基本信息
#!/usr/bin/env python3.5 # -*- coding:utf8 -*- import platform import subprocess import wmi def serv ...
- centos 安装 ntpdate 并同步时间
1.安装ntp yum install -y ntp 2.与一个已知的时间服务器同步 # time.nist.gov 是一个时间服务器 ntpdate time.nist.gov 3.删除本地时间并设 ...
- IO流数据读写总结
1.用java自带的IO读写方法 官方API网站:http://docs.oracle.com/javase/7/docs/api/ 2.Apache的Commons-io-2.4.jar中的方法,参 ...
- U盘安装VMware ESXi 6.0
准备工作 在vmware官网注册,并获取ESXi 6.0 ISO Image: 下载UNetbootin: 容量1GB或以上的U盘,将其格式化. U盘制作 打开UNetbootin,如下图设置,文件路 ...
- pythonRedis 订阅功能实现
两天机器做,host要写订阅主机的ip,客户端发消息,服务端订阅消息 cat redis_connector.py #!/usr/bin/env python__author__ = 'Q.Li'im ...