Revit API Hook 之 拦截鼠标双击元素事件

本文介绍了如何使用Revit API结合Hook技术来拦截鼠标双击元素事件。首先,通过封装HookBase抽象类实现注册和卸载逻辑,接着分别封装线程鼠标Hook和全局鼠标Hook。然后,创建元素监控类以在Revit中应用此功能。最后,进行测试调用来演示整个流程。读者需具备编程基础和Window API知识。
摘要由CSDN通过智能技术生成

阅读本文章前应具有一定编程基础和 Window API 相关知识


第一步,先封装HookBase抽象类,因所有Hook的都具有注册、卸载逻辑,且注册、卸载大同小易。如下:

 public abstract class HookBase : IHook
    {
        private static Dictionary<int, IHook> m_Hooks;
        private IntPtr m_ProcessId;
        private int m_ThreadId;
        private HookType m_HookType;
        private HookProc m_HookProc;

        protected internal int m_HookId;

        static HookBase()
        {
            m_Hooks = new Dictionary<int, IHook>();
        }

        private HookBase(HookType hookType)
        {
            m_HookType = hookType;
            m_HookProc = HookProc;
        }

        protected HookBase(IntPtr processId, HookType hookType)
            : this(hookType)
        {
            m_ProcessId = processId;
            if (m_ProcessId == IntPtr.Zero)
            {
                m_ProcessId = HookHelper.GetCurrentProcessId();
            }
        }

        protected HookBase(int threadId, HookType hookType)
            : this(hookType)
        {
            m_ThreadId = threadId;
            if (m_ThreadId == 0)
            {
                m_ThreadId = HookHelper.GetCurrentThreadId();
            }
        }

        public void Install()
        {
            if (m_ThreadId != 0)
            {
                m_HookId = HookHelper.SetWindowsHookEx(m_HookType, m_HookProc, IntPtr.Zero, m_ThreadId);
            }
            else
            {
                if (m_ProcessId == IntPtr.Zero)
                {
                    return;
                }
                m_HookId = HookHelper.SetWindowsHookEx(m_HookType, m_HookProc, m_ProcessId, 0);
            }

            if (m_HookId == 0)
            {
                return;
            }

            if (!m_Hooks.ContainsKey(m_HookId))
            {
                m_Hooks.Add(m_HookId, this);
            }
        }

        public void Uninstall()
        {
            if (m_HookId == 0)
            {
                return;
            }

            var flag = HookHelper.UnhookWindowsHookEx(m_HookId);
            if (flag)
            {
                if (m_Hooks.Remove(m_HookId))
                {
                    m_HookId = 0;
                }
            }
        }

        protected abstract int HookProc(int nCode, IntPtr wParam, IntPtr lParam);

第二步 ,因鼠标Hook分为线程鼠标Hook以及全局鼠标Hook两种,仅注册方式有点区别。为使用方便,将其封装为事件注册方式。如下

 public abstract class MouseHookBase : HookBase
    {
        protected MouseHookBase(IntPtr processId)
            : base(processId, HookType.WH_MOUSE_LL)
        {

        }

        protected MouseHookBase(int threadId)
            : base(threadId, HookType.WH_MOUSE)
        {

        }

        
  • 4
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值