C# Shortcut für die gesamte Anwendung

roker002

Commander
Registriert
Dez. 2007
Beiträge
2.103
Ich will shortcuts in meine gesamte Anwendung einbauen. das Problem ist, wenn ich jedes mal in der neue Klasse die shortcuts neue deklariere verliere ich einfach die übersicht über die ganzen shortcuts und wenn irgendwann eine änderung im programm stattfinden soll, wird wahrscheinlich die änderung für das SourceCode nicht mitübertragen weil es per hand gemacht worden war.

Ich habe eine andere idee. ich kann einen Windows Componente bauen die eine interne Liste beinhaltet. In diese Liste steht dann im Welchen fenster welche Hotkeys verfügbar sind.

Problem... wie stelle ich fest in welchen Form ich gerade bin? Es sollte ja über Designmanager laufen.
Die liste an sich selbst muss 3 interne Einträge haben. Man kann dafür sehr bequem Dictionary verwenden.

Code:
Dictionary<Object, Dictionary<Control, System.Windows.Forms.Keys>>

Das erste Object ist dann die Form (Klasse der Form) wo man sich gerade befindet. Control ist das Object worauf die Hotkeys dann springen und Keys ist Hotkey selbst.

Hmm alles schön und gut, aber es fehlt noch was... Man muss auch ein event auslösen. Wie das geht habe ich keine ahnung.

Shortcuts kann man für menüs machen aber für normale objecte habe ich keine .NET definition gefunden.


Zusammenfassung...

Suche nach:
  • Form wo man sich gerade befindet
  • Auslösung eines Events

kann da wer weiterhelfen?
 
Zum Thema Auslösen eines Events:

Welche Events möchtest du auslösen? Für Buttons den Klick auslösen ist relativ einfach, da du bei Buttons die Methode PerformClick() verwenden kannst, z.B. "pbOpenFile.PerformClick();"

Bei den restlichen Events, die dir die Controls sonst noch bieten wird es u.U. schwieriger. Da fallen mir mehrere Möglichkeiten ein, die mehr oder weniger funktionieren:

1. Analog zu Button.PerformClick() könnte es eine Control.PerformXYZ() Methode geben, die ich dann bevorzugt verwenden würde

2. Du kannst abgeleitete Klassen der in Frage kommenden Controls erstellen und dann eine als public definierte PerformXYZ() Methode implementieren. Diese Methode macht dann nichts weiter als die OnXYZ Methode der Basisklasse aufzurufen. Damit kannst du dir den Umweg über die Reflection ersparen, was in jedem Fall performanter sein wird.


3. Über Reflection ermittelst du die zum Event gehörige OnXYZ(EventArgs e) Methode, z.B. OnEnter(EventArgs e) und verwendest dann die Invoke() Methode zum Aufrufen

4. Du ermittelst über Reflection die WndProc(ref Message m) Methode des Controls, generierst das Windows Message Objekt und rufst dann mit Invoke die WndProc Methode auf und übergibst das Message Objekt als Parameter

5. Du ermittelst über Reflection die WndProc(ref Message m) Methode der Form, generierst das Windows Message Objekt und rufst dann mit Invoke die WndProc Methode auf und übergibst das Message Objekt als Parameter (Hier gilt es aber zu prüfen/testen, ob auch tatsächlich die Message dann von der Form an das eigentliche Zielcontrol weiter geleitet wird!)

BTW: Ersetze das XYZ durch den Namen des Events deiner Wahl...
 
Zuletzt bearbeitet:
Zurück
Oben