Laden...

Wie kann ich Tastenkombinationen (KeyGesture/KeyBinding) für Sprache und Layout übersetzen?

Erstellt von Perahoky vor 3 Jahren Letzter Beitrag vor 3 Jahren 561 Views
P
Perahoky Themenstarter:in
8 Beiträge seit 2011
vor 3 Jahren
Wie kann ich Tastenkombinationen (KeyGesture/KeyBinding) für Sprache und Layout übersetzen?

Hallo,

ich schreibe gerade eine WPF-Control zum Festlegen von Tastenkombinationen, weil ich kein existierendes finden konnte.

Dort nutze ich das Standard Event (Preview)KeyDown.

System.Windows.Inpput.Key / System.Windows.Inpput.ModifierKeys
System.Windows.Input.KeyGesture, KeyBinding

Ich möchte eine festgelegte Tastenkombination lokalisiert anzeigen lassen - genauso wie man das in vielen anderen Anwendungen wie Office, VisualStudio, Browsern, Spielen etc kennt.

Tastenkombination z.b.:
STRG+N
STRG+Ä
STRG+Umschalt+ß
ALT+BildAuf
Einfg
STRG+Entf
Pos1
Ende

etc.

Nur leider musste ich feststellen dass die Tasten in WPF nicht übersetzt sind und in WinForms nur unvollständig.
In WPF gibts zwar einen KeysConverter und einen KeyGestureConverter, aber der macht nur wenig mehr als ToString() und "+".
Jedenfalls keine Übersetzung, die sind alle als literal strings da drin.

Die Tasten werden ja auch an anderen Stellen erkannt z.B. bei der Eingabe als Text oder in anderen Anwendungen.
Schreiben die das etwa echt alle jedesmal neu?

Kennt das Problem jemand oder kann bitte helfen?

Das Ziel wäre:


CultureInfo.CurrentCulture = new CultureInfo("de");
// Inpput auf QWERTZ-de
new KeyGesture(Modifierkeys.Ctrl, Key.Oem1).ToString(); // Outputs: Strg+Ö

Danke & Liebe Grüße
Pera

Bereits versuchte Wege:

  • WinForms-KeysConverter:
    -- Unvollständig, kommt trotzdem noch "oemOpenBrackets" etc.
    -- ist Obsolete

  • Win32-Api ToUnicode, GetkeyboardState, KeyboardInterop.ToVirtualKey etc.
    -- Funktioniert nicht immer, unvollständig, "oemOpenBrackets" etc. kommt weiterhin

5.658 Beiträge seit 2006
vor 3 Jahren

Ich habe so etwas vor ein paar Jahren mal gemacht. Eine automatische Lösung gab es damals nicht, evtl. hat sich das geändert. Ich hatte es so gelöst, daß ich für die paar Tasten, die eine Beschreibung erforderten, einen Eintrag in den Resoucen für die Lokalisierung angelegt habe:


new HotKeyViewModel(Resources.Resources.BackKey, Key.Back),
new HotKeyViewModel(Resources.Resources.InsertKey, Key.Insert),
new HotKeyViewModel(Resources.Resources.DeleteKey, Key.Delete),
new HotKeyViewModel(Resources.Resources.HomeKey, Key.Home),
new HotKeyViewModel(Resources.Resources.PageUpKey, Key.PageUp),
new HotKeyViewModel(Resources.Resources.PageDownKey, Key.PageDown),
new HotKeyViewModel(Resources.Resources.UpKey, Key.Up),
new HotKeyViewModel(Resources.Resources.DownKey, Key.Down),
new HotKeyViewModel(Resources.Resources.LeftKey, Key.Left),
new HotKeyViewModel(Resources.Resources.RightKey, Key.Right),
new HotKeyViewModel(Resources.Resources.SpaceKey, Key.Space)

Die Modifier-Tasten wie Alt und Strg habe ich auch so definiert. Die meisten anderen Tasten heißen ja in allen (mir bekannten) Sprachen gleich ("A", "1", "F11" usw.). Tasten wie Enter oder Esc habe ich damals für meinen Anwendungsfall nicht mit berücksichtigt.

Weeks of programming can save you hours of planning