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