using System; using System.ComponentModel; using System.Diagnostics; using System.Drawing; using System.Runtime.InteropServices; using System.Security; using System.Windows.Forms; namespace KGdev.BI3D.Revit.Addin.MainWindow.External.BrowserConnector { public partial class MessageHandler : Form { public IntPtr BrowserHandle { get; private set; } [field: DebuggerBrowsable(DebuggerBrowsableState.Never)] public event MessageHandler.MessageReceivedEventHandler MessageReceivedEvent; public void Send(string message) { this.DoSend(message); } private void DoSend(string message) { MessageHandler.MessageStruct messageStruct = new MessageHandler.MessageStruct { Message = message }; int num = Marshal.SizeOf(messageStruct); IntPtr intPtr = Marshal.AllocHGlobal(num); try { Marshal.StructureToPtr(messageStruct, intPtr, true); MessageHandler.COPYDATASTRUCT copydatastruct = default(MessageHandler.COPYDATASTRUCT); copydatastruct.cbData = num; copydatastruct.lpData = intPtr; MessageHandler .NativeMethod .SendMessage(this.BrowserHandle, 74, base.Handle, ref copydatastruct); int lastWin32Error = Marshal.GetLastWin32Error(); } finally { Marshal.FreeHGlobal(intPtr); } } protected override void WndProc(ref Message m) { bool flag = m.Msg == 74; if (flag) { MessageHandler.COPYDATASTRUCT copydatastruct = (MessageHandler.COPYDATASTRUCT) m.GetLParam(typeof(MessageHandler.COPYDATASTRUCT)); bool flag2 = copydatastruct.cbData == Marshal.SizeOf(typeof(MessageHandler.MessageStruct)); if (flag2) { MessageHandler.MessageStruct messageStruct = (MessageHandler.MessageStruct) Marshal.PtrToStructure( copydatastruct.lpData, typeof(MessageHandler.MessageStruct) ); bool flag3 = messageStruct.Message.StartsWith("handle:"); if (flag3) { this.BrowserHandle = new IntPtr( int.Parse(messageStruct.Message.Replace("handle:", "")) ); } else { bool flag4 = messageStruct.Message.StartsWith("close:"); if (flag4) { this.BrowserHandle = IntPtr.Zero; } else { bool flag5 = messageStruct.Message.StartsWith("execute:"); if (flag5) { string text = messageStruct.Message.Replace("execute:", ""); MessageHandler.MessageReceivedEventHandler messageReceivedEvent = this.MessageReceivedEvent; if (messageReceivedEvent != null) { messageReceivedEvent(this, new MessageReceivedEventArgs(text)); } } } } } } base.WndProc(ref m); } private const int MESSAGE_MAX_SIZE = 16777216; private Timer actionHandler = new Timer { Interval = 300 }; internal const int WM_COPYDATA = 74; public delegate void MessageReceivedEventHandler(object sender, MessageReceivedEventArgs e); [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)] internal struct MessageStruct { [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 16777216)] public string Message; } internal struct COPYDATASTRUCT { public IntPtr dwData; public int cbData; public IntPtr lpData; } [SuppressUnmanagedCodeSecurity] internal class NativeMethod { [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)] public static extern IntPtr SendMessage( IntPtr hWnd, int Msg, IntPtr wParam, ref MessageHandler.COPYDATASTRUCT lParam ); } } }