Probleme mit dem Abfragen der Cursortasten unter .NET

Unter .NET bzw. Windows Forms gibt es für das Abfragen von Tasten die Events KeyDown, KeyUp und KeyPress, welche am Formular hängen bzw. an den Controls. In meinem Fall hängen sie an einem Formular bei welchem die KeyPreview Eigenschaft auf true gesetzt ist.

Mit diesen Events kann man problemlos fast alle Tasten abfangen. Problematisch wird es aber bei den Cursortasten. Hier bekomme ich nur ein KeyUp Event. Nun gibt es eine Möglichkeit diese Tasten trotzdem abzufragen in dem die Funktion ProcessCmdKey überladen wird:

protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
{
    bool shift=(keyData&Keys.Shift)!=0;
    bool control=(keyData&Keys.Control)!=0;
    bool alt=(keyData&Keys.Alt)!=0;
    Keys unmodifiedKey=(keyData&Keys.KeyCode);

    if(unmodifiedKey==Keys.Up) DoFoobar(unmodifiedKey);

    return base.ProcessCmdKey(ref msg, keyData);
}

Allerdings funktionierte diese Methode nicht wie gewünscht. Eine andere Methode ist die Überladung der Funktion IsInputKey. Dort wird dann festgelegt das die Cursortasten wie normale Eingabetasten behandelt werden. Allerdings brachte es nichts, diese Funktion im Hauptformular zu überladen, da sie dort nie erreicht wurde. Deshalb wurde sie in dem im Formular befindlichen OpenGL Control überladen:

protected override bool IsInputKey(System.Windows.Forms.Keys keyData)
{
    if((keyData&Keys.KeyCode)==Keys.Up) return true;
    if((keyData&Keys.KeyCode)==Keys.Right) return true;
    if((keyData&Keys.KeyCode)==Keys.Left) return true;
    if((keyData&Keys.KeyCode)==Keys.Down) return true;

    return base.IsInputKey(keyData);
}

Damit kamen die Events für die Cursortasten ganz normal bei den entsprechenden Events des Hauptformulares an.

Weitere Informationen gibt es unter:
http://stackoverflow.com/questions/2434834/processcmdkey-wait-for-keyup
http://familie-ottenhaus.de/simon/blog/2009/12/csharp-eigenes-control-keys-up-down-left-right-onkeydown-onkeypress-vs-processcmdkey/

Singleton unter C#

Ein Singleton ist grob gesagt eine Klasse welche nur einmal initialisiert werden kann. Dies ist ganz praktisch für globale Objekte wie z.B. einen ID Generator, der nur einmal existieren darf. Doch wie schreibt man ein solches Singleton? Laut MSDN-Mag sieht das ganze so aus:

sealed class Singleton
  {
    private Singleton() {}
    public static readonly Singleton Instance = new Singleton() ;
  }

Diese Klasse kann man nun über Singleton.Instance aufrufen. Sie wird dabei bei der ersten Benutzung initialisiert. Da der Konstruktor private ist, kann sie von keiner anderen Klasse initialisiert werden. So wird dafür gesorgt das es nur eine Instanz gibt.

Weitere Informationen gibt es unter:
http://de.wikipedia.org/wiki/Singleton_(Entwurfsmuster)

Probleme mit dem Resource Refactoring Tool

Ich nutze bei der Entwicklung ein sehr hilfreiches Tool namens Resource Refactoring Tool. Normalerweise taucht dieses im Menü Refactor als Extract to Resource auf. Bei mir ist es allerdings einfach verschwunden. Hier hilft es das Addin zu resetten. Dazu geht man in den Ordner C:\Program Files (x86)\Microsoft Visual Studio 10.0\Common7\IDE und öffnet dort eine Kommandozeile. In diese gibt man dann

devenv.exe /resetaddin Microsoft.VSPowerToys.ResourceRefactor.Connect 

ein und schon ist das Problem gelöst :)

Vertimas – Einfache Übersetzung von Resx Dateien

Die Übersetzung von .NET Programmen gestaltet sich doch recht schwierig. Wobei schwierig in diesem Fall das falsche Wort ist. Umständlich trifft es in diesem Fall besser. Vor allem wenn als Entwickler das Qt Übersetzungssystem mit Qt Linguist kennenlernen dürfte. Ein Problem bei der Übersetzung ist, dass man zu jedem Programm mehrere Ressourcen (resx) Dateien in den unterschiedlichsten Sprachen hat z.B. translate.resx, translate.de.resx und translate.nl.resx.

An dieser Stelle ist ein Tool wünschenswert welches diese ganzen Dateien nebeneinander darstellt und einigen Komfort bei der Bearbeitung bietet. Basierend auf dem Resx Resource Translator (http://resxtranslator.codeplex.com) von Hakan Lindestaf habe ich dabei ein Tool namens Vertimas (litauisch für Übersetzung) geschaffen welches einem diesem Arbeit leichter von der Hand gehen lässt.

Vertimas ist dabei ein Open Source Projekt welches unter der GPL steht. Die offizielle Projektseite ist dabei unter https://github.com/seeseekey/Vertimas zu finden. Über Feedback, Verbesserungen und Kritik freue ich mich :)