[StructLayout(LayoutKind.Sequential)]
struct COPYDATASTRUCT
{
public IntPtr dwData;
public int cbData;
public IntPtr lpData;
}
const int WM_COPYDATA = 0x004A;
<StructLayout(LayoutKind.Sequential)> _
Structure COPYDATASTRUCT
Public dwData As IntPtr
Public cdData As Integer
Public lpData As IntPtr
End Structure
None.
public static IntPtr IntPtrAlloc<T>(T param)
{
IntPtr retval = Marshal.AllocHGlobal(Marshal.SizeOf(param));
Marshal.StructureToPtr(param, retval, false);
return (retval);
}
public static void IntPtrFree(IntPtr preAllocated)
{
if (IntPtr.Zero == preAllocated) throw (new Exception("Go Home"));
Marshal.FreeHGlobal(preAllocated); preAllocated = IntPtr.Zero;
}
[StructLayout(LayoutKind.Sequential)]
struct COPYDATASTRUCT
{
public IntPtr dwData;
public int cbData;
public IntPtr lpData;
}
public SendMessage()
{
IntPtr buffer = IntPtrAlloc(txStruct);
COPYDATASTRUCT copyData = new COPYDATASTRUCT();
copyData.dwData = IntPtr.Zero;
copyData.lpData = buffer;
copyData.cbData = Marshal.SizeOf(txStruct);
IntPtr copyDataBuff= IntPtrAlloc(copyData);
SendMessage(hWnd, WM_COPYDATA, IntPtr.Zero, copyDataBuff);
IntPtrFree(copyDataBuff); copyDataBuff = IntPtr.Zero;
IntPtrFree(buffer); buffer = IntPtr.Zero;
}
protected override void WndProc(ref Message m)
{
switch (m.Msg)
{
case (int)WM.COPYDATA:
var msg = Marshal.PtrToStructure<COPYDATASTRUCT>(m.LParam);
var pData = Marshal.PtrToStructure<GEORECT>(msg.lpData);
if (pData.Falconview != FalconShu.FALCONVIEW)
break;
if (MessageType.FV_RUBBERBAND_GEORECT_MSG == pData.Type
&& this.messageId == pData.MessageId)
{
this.Simulation.WeatherArea.N = new LatLong(this.ctrlLatitudeN.Latitude = pData.NW_Latitude, LL.Latitude);
this.Simulation.WeatherArea.W = new LatLong(this.ctrlLongitudeW.Longitude = pData.NW_Longitude, LL.Longitude);
this.Simulation.WeatherArea.S = new LatLong(this.ctrlLatitudeS.Latitude = pData.SE_Latitude, LL.Latitude);
this.Simulation.WeatherArea.E = new LatLong(this.ctrlLongitudeE.Longitude = pData.SE_Longitude, LL.Longitude);
CheckForReadiness();
Externals.SetForegroundWindow(this.Handle);
return;
}
else if (MessageType.FV_RUBBERBAND_GEORECT_CANCELED == pData.Type)
{
// Message overwritten by another attempt to get it
return;
}
break;
}
base.WndProc(ref m);
}