C# 图像处理:实现鼠标选择矩形截图
使用方法如下:
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 = (-),
WH_JOURNALRECORD = ,
WH_JOURNALPLAYBACK = ,
WH_KEYBOARD = ,
WH_GETMESSAGE = ,
WH_CALLWNDPROC = ,
WH_CBT = ,
WH_SYSMSGFILTER = ,
WH_MOUSE = ,
WH_HARDWARE = ,
WH_DEBUG = ,
WH_SHELL = ,
WH_FOREGROUNDIDLE = ,
WH_CALLWNDPROCRET = ,
WH_KEYBOARD_LL = ,
WH_MOUSE_LL =
} } /// <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(, ), new Point(, ), 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 : //Move
MouseMove();
break;
case : //Down
MouseDown();
p_Send = false;
break;
case : //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 < )
{
int _X = _Rect.X;
_Rect.X = _Rect.Width + _Rect.X;
_Rect.Width = _X - _Rect.X;
}
if (_Rect.Height < )
{
int _Y = _Rect.Y;
_Rect.Y = _Rect.Height + _Rect.Y;
_Rect.Height = _Y - _Rect.Y;
}
return _Rect;
} private Rectangle m_MouseRectangle = new Rectangle(, , , );
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 = ;
m_MouseRectangle.Y = ;
m_MouseRectangle.Width = ;
m_MouseRectangle.Height = ;
if (GetScreenImage != null)
{
if (_ScreenRectangle.Width != && _ScreenRectangle.Height != ) 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()[]);
m_HookEx = API.SetWindowsHookEx((int)p_HookCodes, new API.HookProc(SetHookProc), _Value, );
}
/// <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();
return IntPtr.Zero;
}
}
}
在其他项目里引用这个项目就好了
C# 图像处理:实现鼠标选择矩形截图的更多相关文章
- 不同CSS布局实现与文字鼠标选择的可用性——张鑫旭
by zhangxinxu from http://www.zhangxinxu.com本文地址:http://www.zhangxinxu.com/wordpress/?p=2401 一.文字选择的 ...
- Ubuntu中类似QQ截图的截图工具并实现鼠标右键菜单截图
@ 目录 简介: 安装: 设置快捷键: 实现鼠标右键菜单截图: 简介: 在Windows中用惯了强大易用的QQ截图,会不习惯Ubuntu中的截图工具. 软件名为火焰截图,功能类似QQ截图,可以设置快捷 ...
- opencv2 使用鼠标绘制矩形并截取和保存矩形区域图像
前言 好长时间没写博文了,今天偷偷懒写篇关于opencv2中鼠标响应操作的文章. 鼠标操作属于用户接口设计,以前一直使用Qt来做,但是如果只需要简单的鼠标,键盘操作,直接调用opencv库的函数也未尝 ...
- VIM 中鼠标选择不选中行号
VIM 中鼠标选择不选中行号 在Vim中,我们一般会使用 :set nu 打开行号开关. 但是打开行号后,有个弊端,那就是在用鼠标进行选择的时候,会将前面的行号也一起进行拷贝了.但是在gVim中进行选 ...
- 鼠标选择文字事件js代码,增加层问题
在页面中增加一个js代码,当用户用鼠标选择文字(鼠标拖动涂蓝文字)时,会出现一个层,提示与这个选择文字有个的信息<script type="text/javascript"& ...
- 在OpenCV中利用鼠标绘制矩形和截取图像的矩形区域
这是两个相关的程序,前者是后者的基础.实际上前一个程序也是在前面博文的基础上做的修改,请参考<在OpenCV中利用鼠标绘制直线> .下面贴出代码. 程序之一,在OpenCV中利用鼠标绘制矩 ...
- 原创:用VBA实现将鼠标选择的单元格按照指定格式合并并复制到剪切板
原创:用VBA实现将鼠标选择的单元格按照指定格式合并并复制到剪切板 一.主要实现以下功能:1.用鼠标选择单元格(可谓连续单元格,也可为不连续的)后,按照要求格式“证件号码:+选定内容+“,”+”选定内 ...
- Ubuntu 14.04 LTS 火狐浏览器中,鼠标选择文字被删除的解决办法
这篇文章主要介绍了Ubuntu 火狐浏览器中,鼠标选择文字被删除的解决办法,需要的朋友可以参考下在终端中输入命令: ibus-setup将 “在应用程序窗口中启用内嵌编辑模式“ 选项取消
- Javascript技巧实例精选(1)—鼠标选择动态改变网页背景颜色
>>点击这里下载html源文件代码<< 采用Javascript实现,用鼠标点击相应颜色,动态改变网页背景颜色 这是截图 相应的Javascript源代码为: var hex ...
随机推荐
- hive之权限问题AccessControlException Permission denied: user=root, access=WR
问题描述:在集群上,用hive分析数据出现如下错误 FAILED: Execution Error, return code from org.apache.hadoop.hive.ql.exec.D ...
- HDFS操作及小文件合并
小文件合并是针对文件上传到HDFS之前 这些文件夹里面都是小文件 参考代码 package com.gong.hadoop2; import java.io.IOException; import j ...
- es6(12)--类,对象
//类,对象 { //基本定义和生成实例 class Parent{ //定义构造函数 constructor(name='QQQ'){ this.name=name; } } let v_paren ...
- python2.7中不同类型之间的比大小
可以看到,字符串为空的时候也比数字类型大,这是因为python2.7中按照如下规则进行比较: 1.任何两个对象都可以比较. 2.相同类型的对象(实例),如果是数字型(int/float/long/co ...
- Ubuntu下RabbitMQ安装
由于RabbitMQ需要erlang语言的支持,在安装RabbitMQ之前需要安装erlang,执行命令: sudo apt-get install erlang-nox 安装RabbitMQ命令: ...
- 网易微专业 UI设计师
网易云课堂的UI设计师微专业,需要的留言
- vue项目,npm install后,npm run dev报错问题
报错: ERR! code ELIFECYCLE npm ERR! errno 1 npm ERR! metools@1.0.0 dev: `node build/dev-server.js` npm ...
- Es6入门解构
变量解构赋值:数组和对象中提取值,对变量进行赋值 1️⃣模式匹配:只要等号左右两边的模式相同,左边的变量就会被赋予对应的值 2️⃣不完全解构:等号左边的模式匹配等号右边数组的部分 默认值:解构赋值允许 ...
- [Unity动画]06.子状态机
参考链接: https://www.jianshu.com/p/6b1db3d060ac?utm_campaign=maleskine&utm_content=note&utm_med ...
- CopyOnWriteList-JDK1.8
CopyOnWrite,一个写时复制的技术来保证并发操作的安全,使用这种技术的前提是读大于写. 读读之间相容, 写写之间互斥, 读写操作相容. 实现方法: 在对底层数据进行写的时候,把底层数据复制一份 ...