Hi all,
I’m new here, and I know this topic has probably been asked before,
so apologies in advance for repeating it. English isn’t my native language,
but I’m trying to learn some basic C# (I do have a lot of PHP experience).
I’ve been experimenting with building a simple flight tracker using SimConnect —
I managed to get quite far with it, but I’ve hit a wall where the code doesn’t seem to run properly anymore.
I’m hoping someone here might be able to point me in the right direction.
Here’s the part of the code I’m working with:
using Microsoft.FlightSimulator.SimConnect;
using System.Diagnostics;
using System.Runtime.InteropServices;
namespace MyFlightTracker
{
enum DEFINITIONS
{
FlightData
}
enum DATA_REQUESTS
{
RequestFlightData
}
public partial class Tracker : Form
{
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi, Pack = 1)]
/*struct FlightData
{
public double Latitude;
public double Longitude;
public double Altitude;
public double Heading;
}*/
public struct FlightData
{
public double Latitude;
public double Longitude;
public double Altitude;
public double Heading;
}
public Tracker()
{
InitializeComponent();
try
{
simConnect = new SimConnect("My App", this.Handle, WM_USER_SIMCONNECT, null, 0);
MessageBox.Show("✅ SimConnect verbonden!");
// 1. Definieer welke data we willen uitlezen
simConnect.AddToDataDefinition(DEFINITIONS.FlightData, "PLANE LATITUDE", "degrees", SIMCONNECT_DATATYPE.FLOAT64, 0.0f, SimConnect.SIMCONNECT_UNUSED);
simConnect.AddToDataDefinition(DEFINITIONS.FlightData, "PLANE LONGITUDE", "degrees", SIMCONNECT_DATATYPE.FLOAT64, 0.0f, SimConnect.SIMCONNECT_UNUSED);
simConnect.AddToDataDefinition(DEFINITIONS.FlightData, "PLANE ALTITUDE", "feet", SIMCONNECT_DATATYPE.FLOAT64, 0.0f, SimConnect.SIMCONNECT_UNUSED);
simConnect.AddToDataDefinition(DEFINITIONS.FlightData, "PLANE HEADING DEGREES TRUE", "degrees", SIMCONNECT_DATATYPE.FLOAT64, 0.0f, SimConnect.SIMCONNECT_UNUSED);
// 2. Struct koppelen
simConnect.RegisterDataDefineStruct<FlightData>(DEFINITIONS.FlightData);
// 3. Event koppelen
simConnect.OnRecvSimobjectData += simConnect_OnRecvSimobjectData;
/*
simConnect.RequestDataOnSimObjectType(
DATA_REQUESTS.RequestFlightData,
DEFINITIONS.FlightData,
SimConnect.SIMCONNECT_OBJECT_ID_USER,
(SIMCONNECT_SIMOBJECT_TYPE)SIMCONNECT_PERIOD.ONCE
);*/
// 4. Data aanvragen
simConnect.RequestDataOnSimObject(
DATA_REQUESTS.RequestFlightData,
DEFINITIONS.FlightData,
SimConnect.SIMCONNECT_OBJECT_ID_USER,
SIMCONNECT_PERIOD.ONCE,
SIMCONNECT_DATA_REQUEST_FLAG.DEFAULT,
0,
0,
0
);
}
catch (COMException ex)
{
MessageBox.Show("❌ SimConnect niet beschikbaar.\n\n" + ex.Message);
}
}
private void simConnect_OnRecvSimobjectData(SimConnect sender, SIMCONNECT_RECV_SIMOBJECT_DATA data)
{
if ((DATA_REQUESTS)data.dwRequestID == DATA_REQUESTS.RequestFlightData)
{
FlightData flightData = (FlightData)data.dwData;
//FlightData flightData = (FlightData)Marshal.PtrToStructure(data.dwData, typeof(FlightData))!;
//
/*FlightData flightData = new FlightData
{
Latitude = 0,
Longitude = 0,
Altitude = 0,
Heading = 0
};*/
/*FlightData flightData = new FlightData
{
Latitude = (double)((object[])data.dwData)[0],
Longitude = (double)((object[])data.dwData)[1],
Altitude = (double)((object[])data.dwData)[2],
Heading = (double)((object[])data.dwData)[3]
};*/
/*string output = "test";*/
// Toon in een TextBox (bijv. multi-line textbox met naam infoBox)
string output = $"Latitude: {flightData.Latitude}\r\n" +
$"Longitude: {flightData.Longitude}\r\n" +
$"Altitude: {flightData.Altitude} ft\r\n" +
$"Heading: {flightData.Heading}°";
System.Diagnostics.Debug.WriteLine(output);
/*infoBox.Text = output;*/
}
}
protected override void WndProc(ref Message m)
{
if (m.Msg == WM_USER_SIMCONNECT && simConnect != null)
{
simConnect.ReceiveMessage();
}
base.WndProc(ref m);
}
}
}
The issue seems to be with this line:
FlightData flightData = (FlightData)data.dwData;
//FlightData)data.dwData; << red under line ??
I also tried:
FlightData flightData = (FlightData)Marshal.PtrToStructure(data.dwData, typeof(FlightData))!;
//data.dwData << red under line ??
And if I try this version:
FlightData flightData = new FlightData
{
Latitude = (double)((object[])data.dwData)[0],
Longitude = (double)((object[])data.dwData)[1],
Altitude = (double)((object[])data.dwData)[2],
Heading = (double)((object[])data.dwData)[3]
};
It compiles, but then crashes when I run it.
At this point I’m not sure what I’m doing wrong — so any help is much appreciated!
Thanks in advance!
Harrit
or on discord
harritvanbeek