上一篇介绍了一下我的一个个人思路而已、、这一篇来分析分析代码、、、

主要分为两大部分 第一部分 就是 那个自动框选的那部分了啊 第二部分 就是设置Hook(不然窗体一直禁用啊)

先来说说Hook 也就是 钩子 哎哟 叫我说 我也不怎么说的清楚 好吧 就不百度了 根据我的个人理解来说说吧 注意是 个人理解啊

首先呢 平时 我们敲键盘 点 鼠标 的时候 比如 敲键盘 比如我们现在在qq聊天 现在我们正在打字 比如现在我按下了a

现在我们是在键盘上按下了 a 然后呢 键盘上面不是有一条线(好吧无线就算了吧) 然后呢根据这个线 键盘把a传到了机箱 然后呢(处理处理、、)然后呢操作系统接收到了这个按键消息(按下了a) 然后操作系统呢 把这个按键消息 投放到 windows的消息列队中(哎呦 就当是处理消息然后把消息分配到相应地方吧 就相当于邮局) 然后消息列队 根据情况呢(就相当于邮局送快递) 把这个按键消息(a)发送给qq程序 然后 这个按键a就到qq程序上面呢(好吧 弹出来的是输入法 a发送到了输入法 貌似输入法的运行原理就是Dll注入然后打字的时候把按键拦截?、、呃呃呃 我猜的 、、、) 然后Hook了就是在这个消息列队里面安插一个间谍、、比如 我在里面发现a被按下了 我可以把它拦截下来 或者做一些我的处理 或者不管他 好吧正如我刚才说说 安插间谍、、那个这个间谍是什么呢?、、就是回调函数、、当Hook事件发送的时候 会调用回调函数(间谍) 这与这个间谍要干什么 那就看你代码怎么写了、、 很明显 我们这个程序中 这个间谍只需要去监听 鼠标是否按下就是了 然后 根据间谍回报的消息决定窗体是否恢复禁用、、

哎哟 至于Hook什么的这里就不多做讲解了 我讲的对不对我都还不知道呢、、、

得 一次性把Hook的代码放上来 为了避免代码太多杂乱 所以设置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里面判断是否右键抬起public struct POINT {//鼠标位置的结构体public int x;public int y;}public struct MouseLLInfo {//全局鼠标Hook的结构体public POINT pt;    //其实这里可以用Point只是这个新建的类里面没有应用System.Windows.Forms(应该是这个)public int mouseData;public int flags;public int time;public int dwExtraInfo;}GCHandle gc;//好吧 话说就是应为这个东西害得我研究了两天 没有这个的话 程序运行一会儿就提示崩溃了//因为垃圾回收期把我的回调函数当垃圾收了 所以运行程序的时候 一会儿就提示我 一个垃圾的回调导致程序崩溃//在非托管调用托管的时候 必须保持托管代码的或活动性 大概就这个意思 反正就是被收废品的收了、害的我用.net3.5用其他方式设置Hookpublic int MouseHookProcedure(int nCode, IntPtr wParam, IntPtr lParam) {//这个就是回调函数了if (nCode >= 0 && HooKMouseEvent != null) {//先判断是否事件被绑定(感觉有点多余的判断 丫的我不在上面绑定 我写Hook干嘛)//话说是把内存的什么什么转换成结构体MouseLLInfo mouseInfo = (MouseLLInfo)Marshal.PtrToStructure(lParam, typeof(MouseLLInfo));Btn btn = Btn.None;         //自己定义的一个枚举 里面只有三个值if (wParam == (IntPtr)WM_LBUTTONDOWN) {         //如果左键被点下btn = Btn.LeftDowm;} else if (wParam == (IntPtr)WM_RBUTTONUP) {    //如果右键被抬起btn = Btn.RightUp;}//好吧 我就不知道当时我怎么想的 在Hook里面获取的坐标 有负数的现象 所以在那边 我没用这个坐标MouseInfoEventArys e = new MouseInfoEventArys(btn, mouseInfo.pt.x, mouseInfo.pt.y);HooKMouseEvent(this, e);//触发绑定到这个上面的事件}return CallNextHookEx(handleOfHook, nCode, wParam, lParam);//继续下一个钩子}public bool SetMouseHook() {    //设置Hookif (isSet) {//如果已经设置了 就不要设置啦、、、return false;}HookProc MouseCallBack = new HookProc(MouseHookProcedure);handleOfHook = SetWindowsHookEx(WH_MOUSE_LL, MouseCallBack, GetModuleHandle(Process.GetCurrentProcess().MainModule.ModuleName), 0);if (handleOfHook != 0) {//如果设置成功、、gc = GCHandle.Alloc(MouseCallBack);//这个就是那个什么什么、、然后我的回调就不会被收废品的拣去了isSet = true;return true;}return false;}public bool UnLoadMouseHook() {if (!isSet) {//如果装都没有装那么久不要卸载啦、、return false;}if (UnhookWindowsHookEx(handleOfHook)) {gc.Free();//将回调释放掉、、isSet = false;return true;}return false;}}public enum Btn//我只感觉到这三个有用、(应该是两个 左键点下 右键抬起){LeftDowm, RightUp, None}public class MouseInfoEventArys {//话说定义事件的时候都是这么写的 所以我也弄一个内出来保存事件参数private int x;//坐标 多余的后来才发现 鼠标慢慢贴近屏幕边缘的时候 3 2 1 0 -1 、、丫的 负数都出来了public int X {get { return x; }}private int y;//坐标public int Y {get { return y; }}private Btn mBtn;public Btn MBtn {get { return mBtn; }//鼠标的情况}public MouseInfoEventArys(Btn btn,int x,int y) {//构造器mBtn = btn;this.x = x;this.y = y;}}
}

这里我自己定义了一个事件、、然后再程序中 绑定这个事件来完成要做的事情 其实后来 我感觉没有必要弄这么复杂 比如 那个Hook里面获取到的x y坐标都没有用 因为那个坐标会出现负数的情况 所以感觉不爽
效果图:

C#制作QQ截图的自动框选功能的个人思路(二)设置Hook相关推荐

  1. C#制作QQ截图的自动框选功能的个人思路(三)自动框选

    效果图: using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; ...

  2. 基于leaflet完成框选功能(不随地图缩放)并截图打印

    给定一个矩形框用于规定地图打印范围,并截图打印该范围,用户可以在此范围内进行标绘,需要满足以下要求: 1)初始状态下,矩形框不随着地图的放大.缩小.移动而变化位置:(解锁状态) 2)点击锁定按钮后,矩 ...

  3. 基于Fixed定位的框选功能

    最近项目涉及到一个支持批量操作的小需求,交互上需要使用框选来触发.在查阅了一些资料后发现,网上的方案基本都是基于绝对定位布局的,此方案如果是针对全局(在body上)的框选,还是可用的.但是现实需求里几 ...

  4. Android开发之使用SharedPreferences实现QQ登陆的选项框记忆功能(源代码分享)

    本系列文章由@林泓成出品,转载请注明出处. 根据上篇博客讲的SharedPreferences的简单实现,我们来实现下QQ登陆的时候用户名自动显示以及勾选是否记忆用户名和隐身登陆的功能,通过实例来展现 ...

  5. Android仿微博/QQ空间滑动自动播放视频功能

    最近做项目用到了滑动自动播放,下面是原理大家借鉴一下: 关键代码 1.监听滚动事件 首先要给listview添加setOnScrollListener监听,注意这个监听在recyclerView上是a ...

  6. UE4 RTS 框选功能实现

    代码如下,可直接复制粘贴: Begin Object Class=/Script/BlueprintGraph.K2Node_InputKey Name="K2Node_InputKey_0 ...

  7. jquery 万能float浮动层插件 制作QQ MSN 旺旺在线客服功能

    http://www.jsfoot.com/jquery/items/2011-09-27/209.html

  8. vue2 实现鼠标左键拖拽实现框选功能

    一.实现如图所示功能 二.鼠标mousedown事件和click事件重复,不设置click事件可以达到相同效果 // 代码如下 <template><el-dialogtitle=& ...

  9. C#高仿腾讯QQ截图程序

    最近把以前制作的截图程序重新写了一下 动了一个大手术 高质量仿照的TX的截图程序 源码下载1(2012-12-09) http://download.csdn.net/detail/crystal_l ...

最新文章

  1. js中的new file_深受 Pandas 启发的 JavaScript 开源库 — Danfo.js 现已推出!
  2. ubuntu nginx php-fpm mysql_Ubuntu下安装Nginx,PHP5(及PHP-FPM),MySQL
  3. Android--通知之Notification
  4. c# hdf5 写string_Pandas系列之入门篇——HDF5
  5. r语言结构方程模型可视化_R语言时间序列分析(二):ts对象及其可视化
  6. FastSpring.NET V2.05 final 发布[集成Spring.net NHibernate Ajax]
  7. RXJAVA之Subject
  8. mysql权限查看_教您如何查看MySQL用户权限
  9. Speex manul中文版
  10. 1997年小学生计算机知识竞赛,2019年中小学优秀传统文化知识竞赛试题(小学组)97题附全答案...
  11. 51ditu、清华地图以及Google地图
  12. 中英文情感分析模型汇总
  13. My blog has been migrated to GitHub.
  14. DIY M328晶体管测试仪 挖坑 填坑
  15. 如何教你真正的懂得色温?
  16. 2022-09-11-cloud-init
  17. Vuex详解,一文彻底搞懂Vuex
  18. Python 基于卷积神经网络(textCnn)对药品或疾病分类(适用于疾病归一化和药品归一化)
  19. 适应多种通信规约(RS485|红外)的智能电表远程无线抄表的解决方案
  20. 联想3110的LC6001B墨盒加墨历程

热门文章

  1. c web mysql数据库_C语言操作MySQL数据库
  2. halcon窗体的移动和缩放_halcon与C#联合编程之鼠标控制图片缩放,拖动,roi
  3. 亲密关系沟通-【认识需求2】-建立良好沟通环境
  4. 震惊:selenium竟然不是自动化测试工具
  5. d3h 技嘉b365m 黑苹果_黑苹果硬件选购指南主板amp;硬盘amp;WI
  6. java游戏抽卡_怎么处理游戏中抽卡概率算法,每个卡有数量限制,抽完概率也会变。...
  7. convolutional pose machines
  8. 3DShader之移位贴图(Displacement Mapping)
  9. 光通量发光强度照度亮度关系_照度、强光、光通量之间是什么关系
  10. java设置子线程优先级_Java 实例 - 线程优先级设置