=0&&HooKMouseEvent!=null){//先判断是否事件被绑定(感觉有点多余的判断丫的我不在上面绑定我写Hook干嘛)//话说是把内存的什么什么转换成结构体MouseLLInfomouseInfo=(MouseLLInfo)Marshal.PtrToStructure(lParam,typeof(MouseLLInfo));Btnbtn=Btn.None;//自己定义的一个枚举里面只有三个值if(wParam==(IntPtr)WM_LBUTTONDOWN){//如果左键被点下btn=Btn.LeftDowm;}elseif(wParam==(IntPtr)WM_RBUTTONUP){//如果右键被抬起btn=Btn.RightUp;}//好吧我就不知道当时我怎么想的在Hook里面获取的坐标有负数的现象所以在那边我没用这个坐标MouseInfoEventAryse=newMouseInfoEventArys(btn,mouseInfo.pt.x,mouseInfo.pt.y);HooKMouseEvent(this,e);//触发绑定到这个上面的事件}returnCallNextHookEx(handleOfHook,nCode,wParam,lParam);//继续下一个钩子}publicboolSetMouseHook(){//设置Hookif(isSet){//如果已经设置了就不要设置啦、、、returnfalse;}HookProcMouseCallBack=newHookProc(MouseHookProcedure);handleOfHook=SetWindowsHookEx(WH_MOUSE_LL,MouseCallBack,GetModuleHandle(Process.GetCurrentProcess().MainModule.ModuleName),0);if(handleOfHook!=0){//如果设置成功、、gc=GCHandle.Alloc(MouseCallBack);//这个就是那个什么什么、、然后我的回调就不会被收废品的拣去了isSet=true;returntrue;}returnfalse;}publicboolUnLoadMouseHook(){if(!isSet){//如果装都没有装那么久不要卸载啦、、returnfalse;}if(UnhookWindowsHookEx(handleOfHook)){gc.Free();//将回调释放掉、、isSet=false;returntrue;}returnfalse;}}publicenumBtn//我只感觉到这三个有用、(应该是两个左键点下右键抬起){LeftDowm,RightUp,None}publicclassMouseInfoEventArys{//话说定义事件的时候都是这么写的所以我也弄一个内出来保存事件参数privateintx;//坐标多余的后来才发现鼠标慢慢贴近屏幕边缘的时候3210-1、、丫的负数都出来了publicintX{get{returnx;}}privateinty;//坐标publicintY{get{returny;}}privateBtnmBtn;publicBtnMBtn{get{returnmBtn;}//鼠标的情况}publicMouseInfoEventArys(Btnbtn,intx,inty){//构造器mBtn=btn;this.x=x;this.y=y;}}}-IMDN开发者社群-imdn.cn"> =0&&HooKMouseEvent!=null){//先判断是否事件被绑定(感觉有点多余的判断丫的我不在上面绑定我写Hook干嘛)//话说是把内存的什么什么转换成结构体MouseLLInfomouseInfo=(MouseLLInfo)Marshal.PtrToStructure(lParam,typeof(MouseLLInfo));Btnbtn=Btn.None;//自己定义的一个枚举里面只有三个值if(wParam==(IntPtr)WM_LBUTTONDOWN){//如果左键被点下btn=Btn.LeftDowm;}elseif(wParam==(IntPtr)WM_RBUTTONUP){//如果右键被抬起btn=Btn.RightUp;}//好吧我就不知道当时我怎么想的在Hook里面获取的坐标有负数的现象所以在那边我没用这个坐标MouseInfoEventAryse=newMouseInfoEventArys(btn,mouseInfo.pt.x,mouseInfo.pt.y);HooKMouseEvent(this,e);//触发绑定到这个上面的事件}returnCallNextHookEx(handleOfHook,nCode,wParam,lParam);//继续下一个钩子}publicboolSetMouseHook(){//设置Hookif(isSet){//如果已经设置了就不要设置啦、、、returnfalse;}HookProcMouseCallBack=newHookProc(MouseHookProcedure);handleOfHook=SetWindowsHookEx(WH_MOUSE_LL,MouseCallBack,GetModuleHandle(Process.GetCurrentProcess().MainModule.ModuleName),0);if(handleOfHook!=0){//如果设置成功、、gc=GCHandle.Alloc(MouseCallBack);//这个就是那个什么什么、、然后我的回调就不会被收废品的拣去了isSet=true;returntrue;}returnfalse;}publicboolUnLoadMouseHook(){if(!isSet){//如果装都没有装那么久不要卸载啦、、returnfalse;}if(UnhookWindowsHookEx(handleOfHook)){gc.Free();//将回调释放掉、、isSet=false;returntrue;}returnfalse;}}publicenumBtn//我只感觉到这三个有用、(应该是两个左键点下右键抬起){LeftDowm,RightUp,None}publicclassMouseInfoEventArys{//话说定义事件的时候都是这么写的所以我也弄一个内出来保存事件参数privateintx;//坐标多余的后来才发现鼠标慢慢贴近屏幕边缘的时候3210-1、、丫的负数都出来了publicintX{get{returnx;}}privateinty;//坐标publicintY{get{returny;}}privateBtnmBtn;publicBtnMBtn{get{returnmBtn;}//鼠标的情况}publicMouseInfoEventArys(Btnbtn,intx,inty){//构造器mBtn=btn;this.x=x;this.y=y;}}} - IMDN开发者社群-imdn.cn">
登录
首页 » C# » 利用c#写的jpg拼图软件,可以随意剪切和拼接(钩子源码)

利用c#写的jpg拼图软件,可以随意剪切和拼接(钩子源码)

于 2013-12-22 发布
0 319
下载积分: 1 下载次数: 0

代码说明:

利用c#写的jpg拼图软件,可以随意剪切和拼接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用其他方式设置Hook public 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() { //设置Hook if (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; } }}

下载说明:请别用迅雷下载,失败请重下,重下不扣分!

发表评论

0 个回复

  • Winista.Htmlparser
    Winista.Htmlparser
    2014-03-18下载
    积分:1
  • 取句柄软件
    【实例简介】
    2021-08-06 00:30:52下载
    积分:1
  • XLT Unity3D 热修复示例源码
    使用ILRuntime实现的类似XLUA功能的Unity3D下热修复BUG的解决方案请使用Unity2019.2.17f1版本打开,其他版本问题,请自行修复报错提示!Unity3D 5.x版本以下可以使用Unity4.7.2分支~ 和XLUA一样的地方和XLUA原理类似,注入和XLUA基本一致。 不一样的地方使用C#来进行代码的热更,避免项目内lua与C#代码交叉混杂,修复BUG时,需要C#一份,lua一份。 目录以及文件说明: Project-----Assets/XIL             --- 所有XIL所用到的文件----Assets/XIL/ILSource    --- ILRuntime插件源文件----Assets/XIL/Scripts      --- 注入以及初始化代码----Assets/XIL/Auto        --- 自动生成注入的代码以及自动生成的委托和函数的注册(如有此目录下的脚本报错,则可以直接删除此目录,然后重新生成委托,CLR绑定以及重新注册注入类型)----Hot                    --- 补丁源文件存放目录----Hot.sln                 --- 补丁源文件VS解决方案----DyncDll.csproj          --- 补丁项目工程文件----Data/DyncDll.dll        --- 补丁dll文件----Data/DyncDll.pdb       --- 补丁dll的调试文件使用步骤以及菜单项说明:注意:菜单项会根据是否开启热更宏而有所不同 XIL/插件/开启               -- 开启热补丁宏XIL/插件/取消               -- 关闭热补丁宏XIL/插件/PDB开启           -- 加载PDB调试文件XIL/插件/PDB取消           -- 不加载PDB调试文件XIL/注册需要热更的类        -- 生成注入所需要的成员接口XIL/取消需要热更的类        -- 清除注入所需要的成员接口XIL/一键清除                -- 清除自动生成的脚本XIL/一键生成                -- 自动生成委托注册以及注入所需要的脚本XIL/委托自动生成            -- 热更当中操作C#层的委托,需要注册委托相关的类型以及转换代码 这里可自动分析项目当中所有用到的委托,自动注册XIL/清除委托自动生成的脚本  --清除委托自动生成的脚本,删除一些C#脚本,或修改,有可能引起报错,这时可以清除掉自动生成的注册脚本XIL/CLR绑定                -- 非反射的方式调用C#层的接口,可大幅度提高运行效率,一些常用的接口可考虑在GenerateCLRBinding文件当中添加需要CLR绑定的类型。XIL/Hotfix Inject In Editor    -- 编辑器下注入接口只需要两步即可1 先开启补丁宏2 点击一键生成初始化以及资源接口1 需要在项目启动或适当位置调用初始化接口:wxb.hotMgr.Init();2 非编辑器下,需要自己创建加载文件的接口,可参考编辑器下的资源加载类EditorResLoad。生成补丁dll1 打开Hot解决方案2 替换DyncDll工程依赖UnityEngine.dll以及UnityEngine.UI.dll的文件,在目录Hot下,默认是Unity2018.2.11f1版本的,可以替换为自己项目对应的版本3 编译运行DyncDll工程,编译成功,即可在Data目录下生成补丁库。如何添加需要热更的类型:1 使用HotfixAttribute属性宏来修饰类型2 默认情况下所有类型都会被热更注入,如需要自己调整,可修改源文件ExportIL.cs里,FixMarkIL接口,自定义需要热更的类型生成静态DelegateBridge字段名称的规则 没有同名函数,则固定使用"__Hotfix_函数名"方式 有多个同名函数,对这些同名函数进行排序,排序规则如下(可参考接口wxb.Editor.Hotfix.getDelegateName的逻辑):1 参数个数少的在前2 进行字符串拼接,组成key值,规则如下"返回值全名 函数名(参数类型全名1,参数类型全名2,...)",之后通过key值比较,理论上,不同函数,key值是不会相同的 排序之后,取得对应函数在数组当中的下标来进行拼接如何,规则如下"__Hotfix_函数名_下标"的方式 为什么排序,主要是希望能够一眼看过去就知道函数对应的下标是多少,方便Hotfix,以及保证源脚本不变的情况下,每次Hotfix生成的字段名是一致的 如何替换函数一般有三种方式 通过函数名直接替换hotMgr.ReplaceFunc,可参考函数HotHelloWorld.Reg 通过自动生成的接口DelegateBridge对应的字段名,可直接使用hotMgr.ReplaceField,可参考函数HotHelloWorld.Reg 通过添加属性来自动注册,可参考脚本HotHelloWorld.cs与HotTemplate.cs,这里简单说明下, 要替换一个接口,要知道至少三个信息 替换的原类型 替换的接口对应的DelegateBridge字段的名字 热更当中,要替换的MethodInfo可添加属性ReplaceType到热更的类当中,表示此类型下的接口,默认替换的类型可添加属性ReplaceFunction到热更的接口当中,表示此接口需要替换哪个类型的哪个接口,可使用三种方式初始化1 ReplaceFunction(System.Type type) 替换type类型下同名的接口2 ReplaceFunction() 替换ReplaceType类型下同名的接口3 ReplaceFunction(string fieldNameOrTypeName), fieldNameOrTypeName值前缀不同,有不同的含义      a __Hotfix_开头,替换ReplaceType类型fieldName字段对应的接口      b 替换类型全名为fieldNameOrTypeName下同名的接口4 ReplaceFunction(System.Type type, string fieldName) 替换type类型fieldName字段对应的接口5 ReplaceFunction(string type, string fieldName) 替换类型全名为type下fieldName字段对应的接口 一般在没有同名函数情况下,可使用1,2种方式注册,有些类型为非公有类型的,可通过3,5接口,通过类型名来注册有同名函数情况下,就需要使用3,4, 5方式进行注册,可参考HotHelloWorld.cs脚本 通过属性进行自动注册的,假如在类型中含有对应DelegateBridge静态字段的Hotfix变量,则会自动对此变量进行赋值,保存一些参数在实际使用补丁方式热更时,经常遇到一些,只是需要在原有函数之前或之后添加一些代码的情况,这时,你可以通过Hotfix来执行原先代码可参考HotHelloWorld.Start的使用建议使用第3种方式进行接口替换 建议:最好安装下.NET Reflector,可用来反编译被注入的dll,查看源文件,可加深理解XIL的实现原理。项目下文件Library/ScriptAssemblies/Assembly-CSharp.dll这u3d生成的dll文件,原理上,也是修改此文件实现热更新功能,可使用.NET Reflector进行反编译查看源码 热更下模拟MonoBehaviour组件,用法可以参考hotScripts下脚本,可以做到平时在非热更环境下开发调试,到要发版本时再转换为热更方式Unity5.6以下版本,编辑器下使用的Mono库,会报错,应该是Unity3D的Bug。可以使用源文件来替换dll,源文件在压缩包Mono.Cecil.zip下,可解压此文件,放到在Assets/XIL/Scripts/ILHotfix/Editor/下,并删除这三个Dll(Mono.Cecil.dll, Mono.Cecil.Mdb.dll,MonoCecil.Pdb.dll)
    2020-11-27下载
    积分:1
  • U3D调用windowsAPI的一些测试
    U3D调用windowsAPI的一些测试
    2013-08-07下载
    积分:1
  • c# 各种打印实例源码下载(打印报告)
    c# 各种打印实例源码下载(打印报告)
    2015-03-26下载
    积分:1
  • WPF 抽奖器
    简单的抽奖
    2014-03-03下载
    积分:1
  • rtsp client 实现了简单的RTSP的客户端命令 附完整项目源码
    实现了简单的RTSP的客户端命令功能。可以连接darwin服务器,并进行交互。实现了Options,Describ,Setup,Play,teardown命令。
    2013-05-23下载
    积分:1
  • ASP.NET 3.5商用开发架构精解 随书完整源代码下载
    ASP.NET 3.5商用开发架构精解 随书完整源代码下载
    2014-08-13下载
    积分:1
  • Teechart时间曲线实时移动图实例
    Teechart时间曲线实时移动图实例
    2018-07-15下载
    积分:1
  • 提取exe dll文件中的 资源图片文件例子源码下载
    提取exe dll文件中的 资源图片文件例子源码下载
    2015-04-29下载
    积分:1
  • 696516资源总数
  • 106914会员总数
  • 0今日下载