添加项目文件。
This commit is contained in:
@@ -0,0 +1,125 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Diagnostics;
|
||||
using System.IO;
|
||||
using System.Reflection;
|
||||
using System.Windows.Forms;
|
||||
using KGdev.BI3D.Revit.Common;
|
||||
using Newtonsoft.Json;
|
||||
|
||||
namespace KGdev.BI3D.Revit.Addin.MainWindow.External.BrowserConnector
|
||||
{
|
||||
public class ExternalMainWindow : IMainWindow
|
||||
{
|
||||
public bool IsVisible
|
||||
{
|
||||
get
|
||||
{
|
||||
bool flag = this.browserProcess == null;
|
||||
bool flag2;
|
||||
if (flag)
|
||||
{
|
||||
flag2 = false;
|
||||
}
|
||||
else
|
||||
{
|
||||
bool hasExited = this.browserProcess.HasExited;
|
||||
if (hasExited)
|
||||
{
|
||||
flag2 = false;
|
||||
}
|
||||
else
|
||||
{
|
||||
bool flag3 = this.messageHandler.BrowserHandle == IntPtr.Zero;
|
||||
flag2 = !flag3;
|
||||
}
|
||||
}
|
||||
return flag2;
|
||||
}
|
||||
}
|
||||
|
||||
public ExternalMainWindow(IReduxReducer reducer)
|
||||
{
|
||||
this.reducer = reducer;
|
||||
reducer.OnStateChanged += this.Reducer_OnStateChanged;
|
||||
this.messageHandler.MessageReceivedEvent += this.MessageHandler_MessageReceivedEvent;
|
||||
}
|
||||
|
||||
private void Reducer_OnStateChanged(object sender, Dictionary<string, object> e)
|
||||
{
|
||||
string text = JsonConvert.SerializeObject(e);
|
||||
this.messageHandler.Send(text);
|
||||
}
|
||||
|
||||
private void MessageHandler_MessageReceivedEvent(object sender, MessageReceivedEventArgs e)
|
||||
{
|
||||
try
|
||||
{
|
||||
string message = e.Message;
|
||||
Dictionary<string, object> dictionary = JsonConvert.DeserializeObject<
|
||||
Dictionary<string, object>
|
||||
>(message);
|
||||
this.reducer.Reduce(dictionary);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
MessageBox.Show(
|
||||
"Something went wrong when processing the request. Please contact info@kg-dev.be."
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
public void Close()
|
||||
{
|
||||
bool flag = this.browserProcess == null;
|
||||
if (!flag)
|
||||
{
|
||||
bool hasExited = this.browserProcess.HasExited;
|
||||
if (!hasExited)
|
||||
{
|
||||
this.browserProcess.Kill();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void Show()
|
||||
{
|
||||
bool flag = !this.IsVisible;
|
||||
if (flag)
|
||||
{
|
||||
this.CreateNew();
|
||||
}
|
||||
IntPtr browserHandle = this.messageHandler.BrowserHandle;
|
||||
User32.SetForegroundWindow(browserHandle);
|
||||
}
|
||||
|
||||
private void CreateNew()
|
||||
{
|
||||
Process process = new Process();
|
||||
process.StartInfo.FileName = Path.Combine(
|
||||
this.assemblyDirectory,
|
||||
"KGdev.BI3D.Revit.Addin.MainWindow.External.Browser.exe"
|
||||
);
|
||||
process.StartInfo.Arguments = string.Format(
|
||||
"{0} {1}",
|
||||
this.messageHandler.Handle,
|
||||
Process.GetCurrentProcess().Id
|
||||
);
|
||||
process.Start();
|
||||
this.browserProcess = process;
|
||||
}
|
||||
|
||||
private const string BROWSER_EXECUTABLE_RELATIVE_PATH =
|
||||
"KGdev.BI3D.Revit.Addin.MainWindow.External.Browser.exe";
|
||||
|
||||
private readonly MessageHandler messageHandler = new MessageHandler();
|
||||
|
||||
private readonly string assemblyDirectory = Path.GetDirectoryName(
|
||||
new Uri(Assembly.GetExecutingAssembly().CodeBase).LocalPath
|
||||
);
|
||||
|
||||
private Process browserProcess;
|
||||
|
||||
private IReduxReducer reducer;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,38 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Project Sdk="Microsoft.NET.Sdk.WindowsDesktop">
|
||||
<PropertyGroup>
|
||||
<ProjectGuid>{B4556B52-C073-4D6D-A1BE-BCEDEBE41056}</ProjectGuid>
|
||||
<OutputType>Library</OutputType>
|
||||
<RootNamespace>KGdev.BI3D.Revit.Addin.MainWindow.External.BrowserConnector</RootNamespace>
|
||||
<AssemblyName>KGdev.BI3D.Revit.Addin.MainWindow.External.BrowserConnector</AssemblyName>
|
||||
<GenerateAssemblyInfo>False</GenerateAssemblyInfo>
|
||||
<FileAlignment>512</FileAlignment>
|
||||
<TargetFramework>net472</TargetFramework>
|
||||
<UseWindowsForms>True</UseWindowsForms>
|
||||
<PlatformTarget>x64</PlatformTarget>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup>
|
||||
<EnableDefaultItems>False</EnableDefaultItems>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup />
|
||||
<ItemGroup>
|
||||
<Compile Include="ExternalMainWindow.cs" />
|
||||
<Compile Include="MessageHandler.cs">
|
||||
<SubType>Form</SubType>
|
||||
</Compile>
|
||||
<Compile Include="MessageHandler.Designer.cs">
|
||||
<DependentUpon>MessageHandler.cs</DependentUpon>
|
||||
</Compile>
|
||||
<Compile Include="MessageReceivedEventArgs.cs" />
|
||||
<Compile Include="Properties\AssemblyInfo.cs" />
|
||||
<Compile Include="User32.cs" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ProjectReference Include="..\KGdev.BI3D.Revit.Common\KGdev.BI3D.Revit.Common.csproj" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Reference Include="Newtonsoft.Json">
|
||||
<HintPath>C:\ProgramData\Autodesk\Revit\Addins\2020\3DBI for Revit\Newtonsoft.Json.dll</HintPath>
|
||||
</Reference>
|
||||
</ItemGroup>
|
||||
</Project>
|
||||
25
KGdev.BI3D.Revit.Addin.MainWindow.External.BrowserConnector/MessageHandler.Designer.cs
generated
Normal file
25
KGdev.BI3D.Revit.Addin.MainWindow.External.BrowserConnector/MessageHandler.Designer.cs
generated
Normal file
@@ -0,0 +1,25 @@
|
||||
namespace KGdev.BI3D.Revit.Addin.MainWindow.External.BrowserConnector
|
||||
{
|
||||
public partial class MessageHandler : global::System.Windows.Forms.Form
|
||||
{
|
||||
protected override void Dispose(bool disposing)
|
||||
{
|
||||
bool flag = disposing && this.components != null;
|
||||
if (flag)
|
||||
{
|
||||
this.components.Dispose();
|
||||
}
|
||||
base.Dispose(disposing);
|
||||
}
|
||||
|
||||
private void InitializeComponent()
|
||||
{
|
||||
this.components = new global::System.ComponentModel.Container();
|
||||
base.AutoScaleMode = global::System.Windows.Forms.AutoScaleMode.Font;
|
||||
base.ClientSize = new global::System.Drawing.Size(800, 450);
|
||||
this.Text = "MessageHandler";
|
||||
}
|
||||
|
||||
private global::System.ComponentModel.IContainer components = null;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,135 @@
|
||||
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
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,14 @@
|
||||
using System;
|
||||
|
||||
namespace KGdev.BI3D.Revit.Addin.MainWindow.External.BrowserConnector
|
||||
{
|
||||
public class MessageReceivedEventArgs
|
||||
{
|
||||
public string Message { get; }
|
||||
|
||||
public MessageReceivedEventArgs(string message)
|
||||
{
|
||||
this.Message = message;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,13 @@
|
||||
using System;
|
||||
using System.Diagnostics;
|
||||
using System.Reflection;
|
||||
using System.Runtime.CompilerServices;
|
||||
using System.Runtime.Versioning;
|
||||
|
||||
[assembly: AssemblyVersion("1.3.0.0")]
|
||||
[assembly: AssemblyCompany("KGdev.BI3D.Revit.Addin.MainWindow.External.BrowserConnector")]
|
||||
[assembly: AssemblyConfiguration("Release 2020")]
|
||||
[assembly: AssemblyFileVersion("1.3.0")]
|
||||
[assembly: AssemblyInformationalVersion("1.3.0")]
|
||||
[assembly: AssemblyProduct("KGdev.BI3D.Revit.Addin.MainWindow.External.BrowserConnector")]
|
||||
[assembly: AssemblyTitle("KGdev.BI3D.Revit.Addin.MainWindow.External.BrowserConnector")]
|
||||
@@ -0,0 +1,12 @@
|
||||
using System;
|
||||
using System.Runtime.InteropServices;
|
||||
|
||||
namespace KGdev.BI3D.Revit.Addin.MainWindow.External.BrowserConnector
|
||||
{
|
||||
internal static class User32
|
||||
{
|
||||
[DllImport("user32.dll")]
|
||||
[return: MarshalAs(UnmanagedType.Bool)]
|
||||
public static extern bool SetForegroundWindow(IntPtr hWnd);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user