Verschiedene ContextMenues bei einem NotifyIcon

In einer kleinen Applikation mit NotifyIcon in der Taskbar wollte ich unterschiedliche ContextMenues öffnen, je nachdem, ob man mit der linken oder rechten Maustaste auf das Icon klickt.

Die erste Hürde, welche es zu nehmen gilt, ist es, dass ContextMenü auch bei einem Links-Klick zu öffnen. Man kann zwar eine entsprechende Methode nutzen, jedoch gibt es damit Probleme. Daher sollte man hier Reflection nutzen:

// constructor..
this._trayIcon.MouseDown += this.TrayIconMouseDown;

private void TrayIconMouseDown(object sender, MouseEventArgs e)
{
	if (e.Button == MouseButtons.Left)
	{
		MethodInfo mi = typeof (NotifyIcon).GetMethod("ShowContextMenu", BindingFlags.Instance | BindingFlags.NonPublic);
		mi.Invoke(this._trayIcon, null);
	}
}

Nun öffnet sich schon mal das Kontextmenü auch beim Linksklick. Und hier kann man ansetzen, um das Menü entweder zu manipulieren oder zu ersetzen. Ich selbst habe mir einfach zwei Objekte vorbereitet, welche ich je nach Mausklick austausche:

private void TrayIconMouseDown(object sender, MouseEventArgs e)
{
	if (e.Button == MouseButtons.Left)
	{
		this._trayIcon.ContextMenu = this._leftClickMenu;
		MethodInfo mi = typeof (NotifyIcon).GetMethod("ShowContextMenu", BindingFlags.Instance | BindingFlags.NonPublic);
		mi.Invoke(this._trayIcon, null);
	}
	else if (e.Button == MouseButtons.Right)
	{
		this._trayIcon.ContextMenu = this._rightClickMenu;
		MethodInfo mi = typeof(NotifyIcon).GetMethod("ShowContextMenu", BindingFlags.Instance | BindingFlags.NonPublic);
		mi.Invoke(this._trayIcon, null);
	}
}

Beim Testen ist mir aufgefallen, dass es mehrere Events gibt, an die man sich hängen könnte, etwa „MouseUp“, „MouseClick“ usw. Beim Testen hat bei mir allerdings nur „MouseDown“ korrekt funktioniert, bei den anderen hatte ich das Problem, dass zum Teil das Menü erst angezeigt wurde und dann der Eventhandler durchlaufen wurde (ich glaube sogar immer, wenn ich mit der linken Maustaste geklickt habe). Erklären konnte ich es mir allerdings nicht.

Kindle

Vor gut einem Monat habe ich zu meinem Geburtstag einen Kindle geschenkt bekommen. Ich muss sagen, ich bin echt begeistert. Ich besitze nur die kleine Version, welche nur WLAN beinhaltet. Die andere Version besitzt eine integrierte Sim-Karte, mit der man in ca. 100 Ländern kostenlos auf den Amazon-Kindle Shop zugreifen kann, um dort Bücher zu kaufen oder herunterzuladen. Wer nicht dauernd unterwegs oder nicht bereit ist, 40€ mehr zu bezahlen, für den sollte, wie mir, die kleine Version reichen. Ansonsten unterscheiden sie sich nicht.

Das Display

Als ich den Kindle ausgepackt habe, war ein englischer Hinweis auf dem Display, dass ich den Kindle mit dem USB Kabel an den PC anschließen solle, um ihn aufzuladen. Ich habe mit meinen Fingern versucht, die Hinweisfolie zu entfernen. Von vielen Geräten wie dem Handy oder Monitoren ist man gewohnt, dass auf dem Display eine Schutzfolie geklebt ist. Bei mir dauerte es einige Sekunden, bis ich bemerkt habe, dass diese gestochen scharfe Schrift keine Folie sondern der richtige Display war. Mir ist die Kinnlade praktisch schon vor der Inbetriebnahme heruntergefallen.

Der Kindle Shop

Nachdem ich den Kindle mit meinem WLAN verbunden und mit meinem Amazonkonto verknüpft hatte, ging ich erstmal im Kindle-Shop auf Büchersuche. Für einen Test lud ich mir erstmal ein kostenloses Buch herunter, Amazon bietet sehr viele kostenlose Klassiker an (u.a. Jule Vernes oder Max und Moritz). Die Steuerung im Shop erfolgt mit dem 5-Way-Knopf (heißt er so?), praktisch ein Steuerkreuz in alle vier Richtungen sowie dem „Enter“-Knopf in der Mitte. Man navigiert durch die Links und will man einen auswählen, bestätigt man mit Enter. Für einzelne Bücher, welche man sich mal eben schnell kaufen möchte, ist die Navigation per Kindle vollkommen ausreichen. Nervig wird es erst, wenn man ein wenig schmökert und mehrere Bücher kaufen möchte. Denn nach jedem Einkauf landet man wieder auf der Startseite des Kindle-Shops. Da ist der (Massen-)Kauf am PC doch deutlich komfortabler.

Formatdschungel

Die Ebooks aus dem Kindle-Shop kommen in eigenen Kindleformat namens AZW. Zudem wird noch MOBI und PDF unterstützt. Das weit verbreitete ePub-Format wird leider nicht unterstützt. Dies ist natürlich sehr unpraktisch, da andere Webshops wie etwa buch.de nur ePub anbieten. Es gibt zwar Tools (etwa Calibre) um ePub in Mobi und somit für den Kindle umzuwandeln, dies geht allerdings nur, solange das eBook nicht mit einem DRM geschützt ist. Sollte man das Glück haben, kopierschutzfreie eBooks umwandeln zu können, weiß ich nicht, ob es hier Verluste geben kann. Ich habe zwar gelesen, dass MOBI und ePub technisch fast identisch sein sollen, bestätigen kann ich dies aber nicht.
Einen gewaltigen Nachteil hat man, wenn man PDFs nutzt. Ich hatte hier noch einige EBooks rumliegen, die sich im Laufe der Jahre angesammelt haben (Gratisdinger zu Weihnachten usw.). Während man bei AZW bzw. MOBI die Schriftgröße ändern kann und sich das Buch entsprechend auf dem Kindle anpasst, kann man bei PDFs nur zoomen. D.h. man muss dann nach rechts scrollen (sofern man den Kindle hochkant verwendet). Ich komme zwar mit der Schriftgröße der PDFs gut aus, meine Schwiegereltern hatten hier aber erhebliche Probleme. Eine Konvertierung vom PDF in MOBI ist zwar möglich, sah bei meinem Vorlagen aber nicht so schön aus, da mitten im Text die Seitenzahlen standen oder Bilder auf einmal spiegelverkehrt waren, Nach- oder Vorarbeit wäre also von Nöten gewesen (für einen Test aber zu viel). Zudem ist es nicht möglich, sich den Text vorlesen zu lassen (was allerdings auch nur in Englisch möglich ist).

Zubehör

Eigentlich braucht man nicht viel Zubehör, ich habe mir nur eine passende Ledertasche dazugekauft, damit mein Kindle besser geschützt ist, vor allem wenn ich ihn nicht benutze. Es gibt noch eine Version mit Lampe, welche über den Kindle-Akku mit Strom versorgt wird. Zuhause bin ich persönlich allerdings ganz gut mit Lampen ausgestattet.

Fazit

Also ich bin sehr begeistert von meinem Kindle und will ihn nicht mehr hergeben. Ich habe in den letzten vier Wochen soviel gelesen wie in den letzten 3 Jahren davor! Der Akku hält lange, sofern man WLAN und 3G deaktivert hat und ihn nur zum Lesen verwendet. Man kann den Kindle theoretisch auch zum Browsen oder Musik hören nutzen, dafür ist er allerdings nicht gedacht und daher ist hier auch nicht so komfortabel wie ein iPad o.ä. Leider muss man sowas auch immer wieder anderen erklären, ein eBook-Reader ist zum Bücher lesen da und nicht um Videos bei Youtube, Mails bei Google oder Nachrichten bei Facebook anzuschauen. Desweiteren stört mich ein wenig, dass das ganze Betriebssystem nur auf Englisch verfügbar ist, dies stellt gerade für ältere Leute (wie etwa meine Schwiegeeltern) eine unnötige Hürde da. Aber in den wichtigsten Punkt, dem Lesen, ist der Kindle einfach grandios. Ich habe zwar keine anderen eBook-Reader zum Vergleichen, jedoch kann ich sagen, dass man mit ihm ohne Probleme mehrere Stunden lesen kann, ohne dass die Augen oder Arme müden werden (was ja bei dicken Wälzern gern mal vorkommen kann). Auch ist die Schrift dank der elektronischen Tinte scharf ohne Ende. Die fehlende Hintergrundbeleuchtung (das muss man den Youtube und Facebookleuten auch jedes mal erklären) entspannt die Augen ungemein im Vergleich zu einem PC.
Mich stört eigentlich nur eine Tatsache, an der kann Amazon leider nicht viel ändern. Der deutsche Kindle-Shop ist im Vergleich zum amerikanischen winzig. Und die Preise sind dank Buchbindungspreis (annähernd) identisch zu den gedruckten Exemplaren. Ich würde mir hier wünschen, dass die elektronischen Versionen deutlich günstiger werden, da sie ja auch für die Verlage günstiger sind und / oder man bekommt eine eBook-Version gratis zum echten Buch.

Signieren einer XML-Datei in C#

Vielleicht haben sich schon einige von euch mit Lizenzen beschäftigt. Man erstellt eine Software, verkauft sie und möchte natürlich nicht, dass sie einfach von anderen kostenlos genutzt wird. Ich möchte daher heute eine Möglichkeit vorstellen. Sie ist recht simpel aber dennoch sehr flexibel gestaltet.

Um meinen Ansatz zu verstehen, muss man wissen, was eine asymmetrische Verschlüsselung funktioniert. Während bei einer symmetrischen Verschlüsselung mit einem Passwort sowohl ver- als auch entschlüsselt wird, gibt es bei der asymmetrischen Verschlüsselung zwei Schlüssel. Den Private und den Public Key. Während der Private und der Public Key verschlüsseln können, ist nur der Private Key in der Lage wieder zu entschlüsseln. Will man hingegen wissen, ob eine Nachricht wirklich vom Besitzer des Private Keys kommt, spricht man von Signierung. Signieren kann nur der Besitzer des Privaten Schlüssels, während jeder Public Key Besitzer dies verifizieren kann.

Dieses Verhalten kann man ausnutzen, der Hersteller der Software ist im Besitz des Private Keys und signiert Dateien, welche von der Software, welche den Public Key kennt, verifiziert. Sollte die Signatur nicht gültig sein, verweigert die Software ihren Dienst. Sollte jemand den Inhalt der Datei manipulieren, so muss sie wieder mit dem Private Key neu signiert werden.

Ich habe mir daher eine kleine, aber feine Klasse erstellt, welche entweder ein XML-Dokument oder eine Klasse, welche per XmlSerializer serialisierbar ist, signieren kann. So kann man theoretisch jede Information in eine XML-Lizenz-Datei hinterlegen, etwa wie lange die Lizenz gültig ist. Die nötigen Klassen befinden sich alle im .NET-Framework ab Version 2.0. Der Code ist zum Teil aus der MSDN (siehe Links am Ende des Beitrages).

Diese Möglichkeit bietet keinen absoluten Schutz. Leute könnten mit Programmen wie dotPeek an den SourceCode gelangen und die Prüfung ausbauen. Mit einem Obfuscator kann dies erschwert werden. Zudem dürft ihr niemals den privaten Schlüssel herausgeben, da dieser sowohl signieren als auch einen Public Key erstellen kann.

Beispielapplikation:

Hier findet ihr eine kleine Beispielanwendung. Die Form ist sehr trivial, erstellt erst die Keys, dann die Dummy-Klasse, signieren und zum Schluss validieren.

Links:

How to: Sign XML Documents with Digital Signatures
How to: Verify the Digital Signatures of XML Documents
Beispielanwendung

Über ein Jahr mit dem Palm Pre

Seit über einem Jahr besitze ich nun ein Palm Pre. Vorher besaß ich ein Nokia E65, welches zwar gute Dienste leistete, es war aber kein Smart-Phone. Ich hatte damals eigentlich nicht so viele Anforderungen, ich wollte eigentlich ein Handy, mit dem ich meine Emails lesen und meine Termine und evtl. auch noch Kontakte verwalten kann. Das iPhone war mir einfach zu teuer, zudem hab ich ganz große Probleme mit dieser Politik die Apple veranstaltet, ich möchte doch schon gewisse Freiheiten haben. Ob ich sie nutze, ist die andere Frage aber ich könnte es theoretisch.

So wurde ich damals von Marc auf das Palm Pre aufmerksam gemacht. Es hat eine gute Integration von Googles Diensten, ein offenes System und eine riesige Community, welche mich mit allen möglichen Extras versorgen kann. Mit der App-Anzahl eines Apple AppStores kann es zwar nicht mithalten, aber ein gutes Handy bringt ja das wichtigste an Software bereits mit. Also wurde es das gute Ding.

Doch nun, nach einiger Zeit gibt es ein Paar Dinge, die mich dermaßen stören, dass ich drauf und dran bin, mir ein neues Telefon zuzulegen. Vor einiger Zeit erschien webOS 2.1, welches offiziell für mein Palm Pre nicht erschien, aber mit ein paar Tricks war auch das kein Problem. Allerdings löste das Update nicht wirklich meine Probleme oder Dinge, die mich (mittlerweile) nerven.

Fangen wir mal an. Der „Desktop“ vom Pre, er ist riesig, ich kann mir einen schönen Hintergrund anzeigen lassen und sonst nichts. Warum kann ich dort nicht einfach eine Liste mit Terminen oder Notizen hinterlegen oder sonst was? Also ich habe eigentlich nicht ständig irgendwelche Programme laufen, die mir die Sicht versperren. Selbst mein altes Nokia konnte das besser.

Oder häufig habe ich das Problem, dass der Speicher nicht ausreichend ist. Obwohl kein Programm läuft, bekomme ich beim Programmstart die „Zuviele Karten“-Fehlermeldung. Unter webOS 1.x war es so schlimm, dass ich praktisch NIE Angry Birds spielen konnte. Dies hat sich glücklicherweise mit webOS 2.1 deutlich verbessert, tritt aber dennoch ab und an noch auf. Ist schon nett, wenn man jemanden anrufen will, aber das Anrufprogramm nicht starten kann.

Seit dem Update auf 2.1 meckerte mir meine Email / Kalender Synchronisation ab und an die Ohren voll, dass die Zugangsdaten nicht stimmen würden. Warum auch immer, trat sowohl bei Google als auch beim dienstlichen Exchange-Server auf. Manchmal ging es einfach wieder, manchmal musste ich die Daten neu eingeben oder im schlimmsten Fall das Handy neustarten. Direkt nach dem Update trat der Fehler praktisch mehrmals täglich auf, mittlerweile auch eher nur sporadisch (obwohl ich nichts gemacht habe).

Wie auch meine Kollegen habe ich ab und an das Problem, dass das Pre die Verbindung zur Sim-Karte verliert. Sehr ärgerlich, da mein Handy meistens nur rumliegt und ich es daher erst spät mitbekomme. Man ist also nicht erreichbar.
Allerdings habe ich auch sehr häufig das Phänomen, dass mein Handy Empfang hat und auf einmal bekomme ich eine SMS von wegen mich hätte jemand versucht anzurufen. Mein Handy hat aber nicht geklingelt. Ich kann hierbei aber nicht genau sagen, ob es an o2 oder am Pre liegt, mir fehlte bis jetzt die Motivation, es mit anderen Karten zu testen.

Und dann die Akkulaufzeit. Ich habe auf dem Handy selten irgendwas laufen, meistens werden also nur Email, Kalender und Kontakte abgerufen / synchronisiert. Auch habe ich unterwegs eigentlich G3 und WLan ausgeschaltet, um die Akkulaufzeit zu verlängern. Sollte ich dennoch einmal Abends vergessen, mein Telefon aufzuladen (oder ich lege es nicht korrekt auf den TouchStone), kann ich es nächsten Tag auch zu Hause lassen. Ab und an hab ich auch das Problem, dass das Handy mir einen Akkustand von 50% anzeigt, aber es bereits komplett aus ist, wenn ich rund eine halbe Stunde später wieder nach schaue. Ohne Grund, ohne Warnton ohne alles.

Dann zu meinem Lieblingsthema, die Uhr. Wie jedes Moderne Telefon kann sich das Handy die Zeit aus dem Mobilnetz holen. Nur leider scheint o2 dort nach zu gehen, ich weiß es nicht. Ich hatte sehr häufig unterschiede zur „realen“ Zeit bis zu einer Stunde. Auch ein aktualisieren brachte nichts. Dann hab ich das Synchronisieren mit der Netzzeit deaktiviert und manuell gestellt. Sollte nun aber das Telefon einfach ausgehen (wie oben beschrieben z.B.), zählt die Uhr nicht weiter. Ich lade es nun wieder auf und vergesse die Uhr nachzustellen, dann sitze ich halt nachts um drei auf Arbeit, also laut meinem Pre. Da ich keine Armbanduhr trage, muss ich mich auf mein Handy verlassen können, was ich aber augenscheinlich nicht kann.

Mal abgesehen vom verschenkten Desktop-Platz sind das alles Anforderungen, welche ein modernes Telefon erfüllen sollte. Und das Palm Pre tut es leider nicht.

Steam lässt sich nicht starten

Ich hatte eben das Problem, dass sich Steam nicht starten lassen wollte. In der Steam.log stand nur etwas wie

CsComm Session Jun-04-2011 20:02:44.582 [5612] ReconnectThread (5612) Starting

Dieser Eintrag im offiziellen Forum hat mir geholfen, einfach die Datei „ClientRegistry.blob“ im Steam ordner löschen.
Danach ging es wieder.

Update: oder wir starten einfach den Router neu.. Weiß der Geier, was da wieder los war..