Files
2024-01-08 09:30:50 +08:00

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
);
}
}
}