实例介绍
【实例简介】按住鼠标左键拉动可虚线框选
【实例截图】
【核心代码】
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; using System.Runtime.InteropServices; using System.Diagnostics; namespace mousdraw { public partial class Form1 : Form { private bool startdraw = false;//是否开始画图 private Graphics gs;//画版 private Pen pen;//画笔 private Point startpt;//画图起点 public Rectangle taskBarRect;//任务栏位置 public Form1() { InitializeComponent(); WindowState = FormWindowState.Maximized;//本窗体最大化 FormBorderStyle = FormBorderStyle.None;//无边框窗体 TransparencyKey = BackColor;//背景透明(鼠标穿透) DoubleBuffered = true;//双缓存处理 gs = CreateGraphics();//创建窗体画板 pen = new Pen(Color.Black, 3f);//画笔 //taskBarHandle为返回的任务栏的句柄 //Shell_TrayWnd为任务栏的类名 MouseHookProcedure = new HookProc(MouseHookProc); //声明钩子 int taskBarHandle = FindWindow("Shell_TrayWnd", null); GetWindowRect(taskBarHandle, ref taskBarRect); newTaskBarRect = new Rectangle(taskBarRect.X, taskBarRect.Y, taskBarRect.Width - taskBarRect.X, taskBarRect.Height - taskBarRect.Y); StartHook(); } private int hMouseHook = 0; private MouseEventArgs mea;//鼠标事件参数 //全局钩子常量 private const int WH_MOUSE_LL = 14; //声明消息的常量,鼠标按下和释放 private const int WM_LEFT_RBUTTONDOWN = 0x201;//鼠标左键按下事件监听值 private const int WM_LEFT_RBUTTONUP = 0x202;//鼠标左键弹起事件监听值 private const int WM_RIGHT_RBUTTONDOWN = 0x204;//鼠标右键按下事件监听值 private const int WM_RIGHT_RBUTTONUP = 0x205;//鼠标右键按下事件监听值 private const int WM_MOVE = 0x200;//鼠标移动事件监听值 //保存任务栏的矩形区域 public Rectangle newTaskBarRect; //定义委托 public delegate int HookProc(int nCode, int wParam, IntPtr lParam); private HookProc MouseHookProcedure; //寻找符合条件的窗口 [DllImport("user32.dll", EntryPoint = "FindWindow")] public static extern int FindWindow( string lpClassName, string lpWindowName ); //获取窗口的矩形区域 [DllImport("user32.dll", EntryPoint = "GetWindowRect")] public static extern int GetWindowRect( int hwnd, ref Rectangle lpRect ); //安装钩子 [DllImport("user32.dll")] public static extern int SetWindowsHookEx( int idHook, HookProc lpfn, IntPtr hInstance, int threadId ); //卸载钩子 [DllImport("user32.dll", EntryPoint = "UnhookWindowsHookEx")] public static extern bool UnhookWindowsHookEx( int hHook ); //调用下一个钩子 [DllImport("user32.dll")] public static extern int CallNextHookEx( int idHook, int nCode, int wParam, IntPtr lParam ); //获取当前线程的标识符 [DllImport("kernel32.dll")] public static extern int GetCurrentThreadId(); //获取一个应用程序或动态链接库的模块句柄 [DllImport("kernel32.dll")] public static extern IntPtr GetModuleHandle(string name); //鼠标结构,保存了鼠标的信息 [StructLayout(LayoutKind.Sequential)] public struct MOUSEHOOKSTRUCT { public Point pt; public int hwnd; public int wHitTestCode; public int dwExtraInfo; } /// <summary> /// 安装钩子 /// </summary> private void StartHook() { if (hMouseHook == 0) { hMouseHook = SetWindowsHookEx(WH_MOUSE_LL, MouseHookProcedure, GetModuleHandle(Process.GetCurrentProcess().MainModule.ModuleName), 0); if (hMouseHook == 0) {//如果设置钩子失败. this.StopHook(); MessageBox.Show("Set windows hook failed!"); } } } /// <summary> /// 卸载钩子 /// </summary> private void StopHook() { bool stop = true; if (hMouseHook != 0) { stop = UnhookWindowsHookEx(hMouseHook); hMouseHook = 0; if (!stop) {//卸载钩子失败 MessageBox.Show("Unhook failed!"); } } } private int MouseHookProc(int nCode, int wParam, IntPtr lParam) { if (nCode >= 0) { //把参数lParam在内存中指向的数据转换为MOUSEHOOKSTRUCT结构 MOUSEHOOKSTRUCT mouse = (MOUSEHOOKSTRUCT)Marshal.PtrToStructure(lParam, typeof(MOUSEHOOKSTRUCT));//鼠标 mea = new MouseEventArgs(MouseButtons.Left, 1, mouse.pt.X, mouse.pt.Y, 0); //这句为了看鼠标的位置 this.Text = "MousePosition:" mouse.pt.ToString(); mousdraw_MouseMove(mea); if (wParam == WM_LEFT_RBUTTONDOWN || wParam == WM_LEFT_RBUTTONUP || wParam == WM_RIGHT_RBUTTONDOWN || wParam == WM_RIGHT_RBUTTONUP) { //鼠标按下或者释放时候截获 if (newTaskBarRect.Contains(mouse.pt)) { //当鼠标在任务栏的范围内 //如果返回1,则结束消息,这个消息到此为止,不再传递。 //如果返回0或调用CallNextHookEx函数则消息出了这个钩子继续往下传递,也就是传给消息真正的接受者 return 0; } else if (wParam == WM_LEFT_RBUTTONDOWN) { return mousdraw_MouseDown(mea); } else if (wParam == WM_LEFT_RBUTTONUP) { return mousdraw_MouseUp(mea); } else { return 1; } } } return CallNextHookEx(hMouseHook, nCode, wParam, lParam); } private int mousdraw_MouseDown(MouseEventArgs e) { if (e.Button == MouseButtons.Left) { startdraw = true;//开始画图 startpt = e.Location; } return 1; } private int mousdraw_MouseMove(MouseEventArgs e) { if (startdraw) { gs.DrawLine(pen, startpt, e.Location); startpt = e.Location; } return 0; } private int mousdraw_MouseUp(MouseEventArgs e) { startdraw = false;//结束画图 return 1; } } }
好例子网口号:伸出你的我的手 — 分享!
相关软件
小贴士
感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。
- 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
- 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
- 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
- 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。
关于好例子网
本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明
网友评论
我要评论