基本信息
源码名称:C# 透明窗体桌面画图(矩形框选)
源码大小:0.06M
文件格式:.rar
开发语言:C#
更新时间:2018-07-02
友情提示:(无需注册或充值,赞助后即可获取资源下载链接)
嘿,亲!知识可是无价之宝呢,但咱这精心整理的资料也耗费了不少心血呀。小小地破费一下,绝对物超所值哦!如有下载和支付问题,请联系我们QQ(微信同号):813200300
本次赞助数额为: 3 元×
微信扫码支付:3 元
×
请留下您的邮箱,我们将在2小时内将文件发到您的邮箱
源码介绍
按住鼠标左键拉动可虚线框选
按住鼠标左键拉动可虚线框选
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; } } }