Autor Beitrag
Frühlingsrolle
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Do 30.11.17 06:51 
- Nachträglich durch die Entwickler-Ecke gelöscht -
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4037
Erhaltene Danke: 834

Win7
C++, C# (VS 2015/17)
BeitragVerfasst: Do 30.11.17 11:10 
Hallo,

ein direktes Äquivalent in C# gibt es dafür nicht, aber unter Does C# have an equivalent of Delphi's message keyword? gibt es Code auf Basis von Attributen und Reflection.

Eine andere unterstützte Möglichkeit ist mittels der IMessageFilter-Schnittstelle, wie in Trapping windows messages (in C#) beschrieben. Wenn man dann noch ein Dictionary<int, Delegate> einführt, in dem sich einzelne Message-Methoden eintragen würden, wäre die PreFilterMessage auch relativ generisch (und wiederverwendbar), à la:
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
delegate void MessageDelegate(ref Message);

Dictionary<int, MessageDelegate> MessageMap;

void RegisterMessage(int message, MessageDelegate onMessage)
{
  MessageMap.Add(message, onMessage);
}

public bool PreFilterMessage(ref Message message)
{
  MessageDelegate onMessage;
  if (MessageMap.TryGetValue(message.Msg, out onMessage))
  {
    if (onMessage != null)
    {
      onMessage(ref message);

      return true;
    }
  }

  return false;
}

Man bräuchte dann nur eine Initialisierungsmethode, in der die ganzen Messages registriert werden.

Alternativ kann man diesen Code natürlich auch bei einer WndProc-Methode verwenden.
Frühlingsrolle
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Do 30.11.17 17:28 
- Nachträglich durch die Entwickler-Ecke gelöscht -
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4037
Erhaltene Danke: 834

Win7
C++, C# (VS 2015/17)
BeitragVerfasst: Fr 01.12.17 11:03 
Ich nehme an, dir geht es um folgende Strukturen: Winapi.Messages?

Da in C# die Signatur von WndProc bzw. PreFilterMessage fest vorgegeben ist, also mit dem Parameter ref Message, müßte man mindestens einmal das Casten selber vornehmen. Jedoch gibt es dabei folgende Probleme:
- Strukturen können nicht direkt gecastet werden (außer mittels unsafe per Zeiger zu arbeiten)
- Strukturen können auch nicht vererbt werden (ansonsten könnte man passende Eigenschaften oder Methoden hinzufügen)

Ich habe auch im Internet keine Definitionen der WinApi-Message-Strukturen für C#/.NET gefunden (auch nicht auf P/Invoke.com) - anscheinend greifen alle direkt auf die Message-Member (WParam, LParam) zu.

Das einzige, was mir einfällt, wären explizite Methodenerweiterungen. Hier mal ein Beispiel: Ideone-Code (mit eigener Message-Struktur, da System.Windows.Forms nicht bekannt).

Hier noch mal der relevante Code:
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
static class WinExtensions
{
  public static bool WMActivateApp_Active(this Message m)
  {
    return (int)m.WParam != 0;
  }
}

public class Test
{
  public static void Main()
  {
    Message m = new Message();
    
    Console.WriteLine(m.WMActivateApp_Active());
  }
}

Eine andere Möglichkeit sehe ich noch im Marshalling, wie z.B. in C#: Convert struct to another struct beschrieben.

Ich hoffe, eine der Möglichkeiten kannst du für dich umsetzen.
Frühlingsrolle
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Fr 01.12.17 12:22 
- Nachträglich durch die Entwickler-Ecke gelöscht -