136 lines
4.8 KiB
C#
136 lines
4.8 KiB
C#
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<MessageHandler.MessageStruct>(messageStruct);
|
|
IntPtr intPtr = Marshal.AllocHGlobal(num);
|
|
try
|
|
{
|
|
Marshal.StructureToPtr<MessageHandler.MessageStruct>(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
|
|
);
|
|
}
|
|
}
|
|
}
|