Entwickler-Ecke
Sonstiges (.NET) - Auf Messages ohne WndProc in C# reagieren
Delete - Do 30.11.17 05:51
Titel: Auf Messages ohne WndProc in C# reagieren
- Nachträglich durch die Entwickler-Ecke gelöscht -
Th69 - Do 30.11.17 10:10
Hallo,
ein direktes Äquivalent in C# gibt es dafür nicht, aber unter
Does C# have an equivalent of Delphi's message keyword? [
https://stackoverflow.com/questions/5707832/does-c-sharp-have-an-equivalent-of-delphis-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#) [
https://www.codeproject.com/Articles/3946/Trapping-windows-messages] 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:
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.
Delete - Do 30.11.17 16:28
- Nachträglich durch die Entwickler-Ecke gelöscht -
Th69 - Fr 01.12.17 10:03
Ich nehme an, dir geht es um folgende Strukturen:
Winapi.Messages [
http://docwiki.embarcadero.com/Libraries/Berlin/de/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 [
http://www.pinvoke.net/]) - 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 [
https://ideone.com/rA42kn] (mit eigener
Message-Struktur, da
System.Windows.Forms nicht bekannt).
Hier noch mal der relevante Code:
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 [
https://stackoverflow.com/questions/3798891/c-sharp-convert-struct-to-another-struct] beschrieben.
Ich hoffe, eine der Möglichkeiten kannst du für dich umsetzen.
Delete - Fr 01.12.17 11:22
- Nachträglich durch die Entwickler-Ecke gelöscht -
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2024 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!