using Autodesk.Revit.UI;
using DotNet.Revit.Hook.Achieve;
using DotNet.Revit.Hook.Helper;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace DotNet.Revit.Hook
{
///
/// 元素监控.
///
public class ElementMonitor
{
private static ElementMonitor m_Instance;
private MouseHook m_MouseHook;
private bool m_IsMonitor;
private UIApplication m_UIApplication;
private ElementMonitor(UIApplication uiApp)
{
m_Instance = this;
m_UIApplication = uiApp;
m_MouseHook = new MouseHook();
m_MouseHook.Install();
m_MouseHook.MouseDoubleClick += OnRaiseMouseDoubleClick;
}
///
/// 静态实例,可在入口类判断此实例是否为null,防止重复注册.
///
public static ElementMonitor Instance
{
get
{
return m_Instance;
}
}
///
/// 是否监控.
///
public bool IsMonitor
{
get
{
return m_IsMonitor;
}
set
{
m_IsMonitor = value;
}
}
///
/// 当鼠标双击元素时触发此事件.
///
public event HookHandler DoubleClickElement;
///
/// 注册元素监控,并指定是否立即监控.
///
public static void Register(UIApplication uiApp)
{
if (uiApp == null)
{
throw new ArgumentNullException(nameof(uiApp));
}
new ElementMonitor(uiApp)
{
m_IsMonitor = true
};
}
///
/// 注册元素监控,并指定是否立即监控.
///
public static void Register(UIControlledApplication uiControllApp)
{
if (uiControllApp == null)
{
throw new ArgumentNullException(nameof(uiControllApp));
}
var flag = System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.InvokeMethod;
var uiApp = (UIApplication)uiControllApp.GetType().InvokeMember("getUIApplication", flag, Type.DefaultBinder, uiControllApp, null);
Register(uiApp);
}
///
/// 返回1,则拦截鼠标消息,返回0则传递给真正消息接收者.
///
private int OnRaiseMouseDoubleClick(object sender, System.Windows.Forms.MouseEventArgs e)
{
if (this.DoubleClickElement == null)
{
return 0;
}
if (!m_IsMonitor || e.Button != MouseButtons.Left || e.Clicks != 2)
{
return 0;
}
var uiDoc = m_UIApplication.ActiveUIDocument;
if (uiDoc == null)
{
return 0;
}
var elemIds = uiDoc.Selection.GetElementIds();
if (elemIds.Count == 1)
{
var elem = uiDoc.Document.GetElement(elemIds.First());
if (elem == null)
{
return 0;
}
return this.DoubleClickElement(this, new DoubleClickElementEventArgs(elem));
}
return 0;
}
}
}