[C#] Windows Messages behandeln, mit WM_COPYDATA übergebene Structe auswerten

Im folgenden Beispiel wir die bestehende WndProc-Funktion der Basis-Fensterklasse überschrieben, um die Auswertung von Windows-Messages zu ermöglichen. Es werden beispielhaft drei verschiedene Messages ausgewertet (WM_MYOWNMESSAGE, WM_ACTIVATEAPP, WM_COPYDATA) um unterschiedliche Funktionen zu demonstrieren. Siehe auch folgenden Beitrag: Link

using System.Runtime.InteropServices;

// eigene Message definieren (sowohl auf Sender- als auch Empfängerseite)
private const int WM_MYOWNMESSAGE = 11111;

/// <summary>
/// Struct für die Stringübergabe an andere Fenster
/// </summary>
public struct SCopyData
{
    public IntPtr dwData;
    public int cbData;
    [MarshalAs(UnmanagedType.LPStr)]
    public string lpData;
}

// Funktion zur Behandlung eingehender Messages für ein Fenster
// dazu WndProc der Fenster-Basisklasse überschreiben
[PermissionSet(SecurityAction.Demand, Name = "FullTrust")]
protected override void WndProc(ref Message m)
{
    switch (m.Msg)
    {
        // eigene Message auswerten, in LParam ist z.B. ein int-Wert
        case WM_MYOWNMESSAGE:
            Console.WriteLine("Messagedaten empfangen: {0}", (int)m.LParam);
            break;
        // WM_ACTIVATEAPP tritt auf, wenn das Fenster aktiviert/deaktiviert wird
        case WM_ACTIVATEAPP:
            if ((int)m.WParam == 0)
            {
                // m.WParam == 0 -> Fenster wurde deaktiviert
                Console.WriteLine("Fenster wurde deaktiviert.");
            }
            else
            {
                // m.WParam == 1 -> Fenster wurde aktiviert
                Console.WriteLine("Fenster wurde aktiviert.");
            }
            break;
        // bei WM_COPYDATA können Structe über Windows-Messages
        // versendet werden, die Strings enthalten
        case WM_COPYDATA:
           // Struct aus LParam extrahieren
           SCopyData cds = (SCopyData)m.GetLParam(typeof(SCopyData));
           // übergebenen String ausgeben
           Console.WriteLine("String per Windows-Message empfangen: " + cds.lpData);
           break;
    }

    // abschließend noch die Funktion der Basisklasse aufrufen
    base.WndProc(ref m);
}