以下类通过挂载勾子原理,实现将子控件鼠标消息发送给父控件。

调用:

MousePreview mp=new MousePreview(pControl);  //pControl为父控件

//启用勾子

mp.EnableHook();

//禁用勾子

mp.DisableHook();

using System;

using System.Collections.Generic;

using System.Text;

using System.Runtime.InteropServices;

using System.Drawing;

using System.Windows.Forms;

public class MousePreview

{

/// <summary>

/// Hook管理器

/// </summary>

GCHandle mGC;

[DllImport("kernel32")]

public static extern int GetCurrentThreadId();

/// <summary>

/// 挂载勾子

/// </summary>

/// <param name="idHook"></param>

/// <param name="lpfn"></param>

/// <param name="hmod"></param>

/// <param name="dwThreadId"></param>

/// <returns></returns>

[DllImport("user32", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]

public static extern IntPtr  SetWindowsHookEx(int idHook, HOOKPROC lpfn, int hmod, int dwThreadId);

/// <summary>

/// 卸载勾子

/// </summary>

/// <param name="hhook"></param>

/// <returns></returns>

[DllImport("user32.dll", CharSet = CharSet.Auto, ExactSpelling = true)]

public static extern bool UnhookWindowsHookEx(IntPtr hhook);

/// <summary>

/// 发送消息

/// </summary>

/// <param name="hwnd"></param>

/// <param name="wMsg"></param>

/// <param name="wParam"></param>

/// <param name="lParam"></param>

/// <returns></returns>

[DllImport("user32.dll", EntryPoint = "SendMessage")]

public static extern IntPtr  SendMessage(IntPtr hwnd, int wMsg, int wParam, int lParam);

public delegate int HOOKPROC(int nCode, int wParam, int lParam);

private Control mControl;

private IntPtr mHook=IntPtr.Zero;

/// <summary>

/// 构造

/// </summary>

/// <param name="pControl"></param>

public MousePreview(Control pControl)

{

mControl = pControl;

}

/// <summary>

/// 启用挂勾子

/// </summary>

public void EnableHook()

{

if (mHook == IntPtr.Zero)

{

HOOKPROC proc = new HOOKPROC(MyMouseProc);

mGC=GCHandle .Alloc(proc);

mHook = SetWindowsHookEx(7, proc, 0, GetCurrentThreadId());

}

}

/// <summary>

///

/// </summary>

public void DisableHook()

{

if (mHook != IntPtr.Zero)

{

UnhookWindowsHookEx(mHook);

mGC.Free();

}

mHook = IntPtr.Zero;

}

/// <summary>

/// 处理消息事件

/// </summary>

/// <param name="nCode"></param>

/// <param name="wParam"></param>

/// <param name="lParam"></param>

/// <returns></returns>

private  int MyMouseProc(int nCode, int wParam, int lParam)

{

if (nCode == 0)

{

GC.Collect();

GC.WaitForPendingFinalizers();

GC.Collect();

Rectangle _Rect = mControl.RectangleToScreen(mControl.ClientRectangle);

if (!_Rect.Contains(Cursor.Position)) return 0;

short _X = (short)(Cursor.Position.X - _Rect.X);

short _Y = (short)(Cursor.Position.Y - _Rect.Y);

int _Point = _Y << 16;

_Point += _X;

switch (wParam)

{

case 0x200: //移动鼠标

case 0x201:  //按下左键

case 0x202:  //释放左键

case 0x203:  //双击左键

case 0x204:  //按下右键

case 0x205:  //释放右键

case 0x206:  //双击右键

case 0x207:  //按下中键

case 0x208:  //释放中键

case 0x209:   //双击中键

SendMessage(mControl.Handle, wParam, wParam, _Point);

break;

/*

case 512:

SendMessage(mControl.Handle, 512, wParam, _Point);

break;

case 513:

SendMessage(mControl.Handle, 513, wParam, _Point);

break;

case 514:

SendMessage(mControl.Handle, 514, wParam, _Point);

break;

case 516:

SendMessage(mControl.Handle, 516, wParam, _Point);

break;

case 517:

SendMessage(mControl.Handle, 517, wParam, _Point);

break;

*/

default:

break;

}

}

return 0;

}

}

将鼠标消息发送给指定的父控件_勾子相关推荐

  1. WPF查找子控件和父控件方法

    原文:WPF查找子控件和父控件方法 public List<T> GetChildObjects<T>(DependencyObject obj, string name) w ...

  2. 解决ImageView超出父控件(或屏幕边界)时,图片挤压问题

    一.需求 在屏幕边缘显示一张图片,超出屏幕宽度时,只显示图片的左边部分,并且不被挤压,其余部分剪切.但我在实际开发中,踩了个坑,这里做个记录,下面通过图片直观了解一下情况: 理想 现实 目前可以确定, ...

  3. android 父控件的背景_android控件的属性

    android控件的属性 本节描述android空间的位置,内容等相关属性及属性的含义 第一类:属性值为true或false android:layout_centerHrizontal 水平居中 ( ...

  4. 小程序:自定义控件,父控件与子控件的交互triggerEvent

    实现目标,自定义控件一通用型喜欢按钮组件,包含喜欢和取消喜欢两种状态:如图 1.组件内的交互 点击爱心,UI上会变红心与空心  数据+1  -1 2.与父控件的交互,点击喜欢和取消喜欢,父控件发送网络 ...

  5. 超出父控件怎么才能点击

    首先:我们先总结一下控件不能交互的原因有哪些? // 1.控件的用户交互被关闭了! -> userInteractionEnable = NO[用户交互]!// 2.控件隐藏了! hidden ...

  6. pyqt 子控件更新父控件ui

    可以用信号槽,好像专业点. 也可以直接用变量通信. 子控件更新父控件ui时,重新弹了一个窗口,父控件重新建了一个实例 仔细查原因 是子控件,父控件都有信号槽,相互连接,把关系搞串了,后来删掉一端的信号 ...

  7. Android中setLayoutParams要用父控件的LayoutParams

    这几天做程序想明白了一个问题,在此做一下记录. ActionBarCustomView customview = new ActionBarCustomView(context); ActionBar ...

  8. js 对表格的动态操作(动态添加行,删除该行,在指定位置添加控件)

    ***************************************************************** js动态添加表的列,并在列中添加控件的方法<html> ...

  9. 使用权重如何让一个控件的宽度为父控件的 1/3?

    可以在水平方向的 LinearLayout 中设置 weightSum 为 3,然后让其子控件的 weight 为 1,那么该子控件就是父控件的 1/3. 转载于:https://www.cnblog ...

最新文章

  1. 关掉可穿戴部门后,英特尔还将调整自动驾驶业务
  2. R语言dplyr包使用transmute函数生成新的数据列(删除所有原数据列)实战
  3. java xsl生成word文件_导出生成xsl文件
  4. 推荐:数据竞赛的利器XGBoost的常见面试题
  5. 11g RAC OCR,VOTING DISK存储全部损坏,利用自动备份,恢复OCR,VOTING DISK到新存储。...
  6. centOS安装openoffice的方法
  7. 一文搞定Matplotlib 各个示例丨建议收藏
  8. 【岗位详情】腾讯广告机制策略算法工程师(北京)
  9. android解析JSON数组
  10. Kotlin 的工作原理
  11. SUSE12 sp1如何进入单用户模式
  12. MySQL 8.0.29安装版安装教程
  13. 华为IPSec VPN的配置
  14. 转:如何在艰难时期留住好员工
  15. 倒计时 4天,COSCon'22 会议议程全览 精彩亮点抢鲜看!
  16. 乔布斯2005的演讲
  17. Linux基础-日志管理
  18. python学什么内容_老男孩Python都需要学什么内容?老男孩教育
  19. 数据安全被篡改的风险分析解决方案
  20. 奥园医美将借助奥园集团品牌优势,在中国引入领先医美技术

热门文章

  1. Python基础 - Excel导入导出
  2. C# 判断是否是国内手机号(电信、联通、移动)
  3. 某企业每月给其A、B、C 和D 四个门店一共发送6 个集装箱的某种货物,如果各门店出售该种货物的利润(万元)如下表:
  4. UBNT ERLite-3 修复过程
  5. 可爱的“符号表情”emoticon
  6. 腾讯电脑管家有病毒并已致歉?“火绒安全”到底是什么来头?
  7. 2012.网研院.Problem D.最远距离
  8. WIN10 的虚拟内存pagefile.sys占用C盘资源的解决办法
  9. 家用计算机如何关机,电脑关机,教您怎么设置电脑定时关机
  10. 以太网封装及vlan封装类型