Vollbild-Fenster ohne Taskbar in WPF / C#

Für eine kleine Anwendung in WPF / C# wollte ich heute einen Vollbild-Modus realisieren. Voraussetzung:

  • Aktivieren des Vollbild-Modus mit [F10]
  • Deaktivieren des Vollbild-Modus mit [F10] oder [Esc]

Der erste Schritt dazu – klar: Abonnieren des KeyUp-Events:

this.KeyUp += new KeyEventHandler(_this_KeyUp);

Oder eben in WPF:

<Window [...] KeyUp="_this_KeyUp">
    ...
</Window>

Der einfache EventHandler lautete wie folgt:

        private void _this_KeyUp(object sender, KeyEventArgs e)
        {
            bool IsFullscreen = WindowState == WindowState.Maximized;
            bool MaxKeyPressed = e.Key == Key.F10;
            bool NrmKeyPressed = e.Key == Key.Escape;

            if (!IsFullscreen && MaxKeyPressed)
            {
                WindowState = WindowState.Maximized;
                WindowStyle = WindowStyle.None;
                ResizeMode = ResizeMode.NoResize;
                e.Handled = true;
            }
            else if(MaxKeyPressed || NrmKeyPressed)
            {
                WindowState = WindowState.Normal;
                WindowStyle = WindowStyle.SingleBorderWindow;
                ResizeMode = m_DefaultResizeMode;
                e.Handled = true;
            }
        }

Problem Nr. 1: Es passiert nichts… Das Event wird ausgelöst – der Vergleich `e.Key == Key.F10` trifft aber niemals zu.

Also den Debugger angeworfen – des Rätels Lösung ist zwar auf den ersten Blick seltsam, aber am Ende simpel: bei Betätigen der [F10]-Taste ist der Wert `e.Key == Key.System`. Die Abfrage, ob [F10] gedrückt wurde, muss also wie folgt lauten:

bool MaxKeyPressed  = e.Key == Key.System && e.SystemKey == Key.F10

OK- die Anwendung reagiert nun auf Druck der F10-Taste, das Switchen der Fenster-Stati funktioniert ebenfalls.

Fast… – das Fenster sollte noch die Taskleiste überdecken. Auch das ist am Ende einfach zu lösen:

Beim Setzen der Fenster-Eigenschaften muss eine definierte Reihenfolge eingehalten werden. Mit folgendem Code funktioniert dann alles wie gewünscht:

        private void _this_KeyUp(object sender, KeyEventArgs e)
        {
            bool IsFullscreen = WindowState == WindowState.Maximized;
            bool MaxKeyPressed = (e.Key == Key.System && e.SystemKey == Key.F10);
            bool NrmKeyPressed = e.Key == Key.Escape;

            if (!IsFullscreen && MaxKeyPressed)
            {
                WindowStyle = WindowStyle.None;
                ResizeMode = ResizeMode.NoResize;
                WindowState = WindowState.Maximized;
                e.Handled = true;
            }
            else if(MaxKeyPressed || NrmKeyPressed)
            {
                e.Handled = true;
                WindowState = WindowState.Normal;
                ResizeMode = m_DefaultResizeMode;
                WindowStyle = WindowStyle.SingleBorderWindow;
            }
        }

Um mit der Angabe `WindowState = WindowState.Maximized` auch die Taskbar zu überdecken, müssen lediglich vorher alle Rahmen ausgeblendet werden. Das geschieht hier durch Setzen des `WindowStyle` und `ResizeMode`.

Veröffentlicht unter Allgemein, wpf | Verschlagwortet mit , , , , , | Hinterlasse einen Kommentar

Teamviewer mit Parameter ausführen

Um “mal eben” von unterwegs per Fernwartung auf meine Computer zugreifen zu können, verwende ich das TeamViewer Modul für unbeaufsichtigten Zugriff.

Um das Herstellen der Verbindung noch weiter zu beschleunigen als es durch das Hinzufügen der eigenen Computer in einen TeamViewer-Account möglich ist, lassen sich diverse Aufrufparameter verwenden.

Die folgenden Parameter stehen zur Verfügung:

  • TeamViewer ID
    --id

    Hinweis: Im internen Netzwerk lässt sich hier auch die IP-Adresse oder der Name des entfernten Computers nutzen.

  • TeamViewer Passwort
    --Password
  • TeamViewer Modus
    --mode

    Für den Parameter mode stehen die folgenden Modi zur Verfügung:

    • Fernsteuerung
      --mode teamwork
    • Dateiübertragung
      --mode fileTransfer
    • VPN-Verbindung
      --mode vpn
  • Übertragungs-Qualität
    --quality

    Für den Parameter quality stehen die folgenden Angaben zur Verfügung:

    • Angabe “Automatisch”
      --quality 1
    • Angabe “Qualität optimieren”
      --quality 2
    • Angabe “Geschwindigkeit optimieren”
      --quality 3
    • Angabe “Eigene Einstellungen”
      --quality 4

Diese Parameter lassen sich natürlich auch hervorragend nutzen, um z.B. aus einer Kundenverwaltungs-Software heraus das Fernwartungsmodul direkt zur Verbindung mit einem Kundenrechner zu starten.

Veröffentlicht unter tools | Verschlagwortet mit , , | Hinterlasse einen Kommentar

rextester – Online-Testumgebung für C#, C++, Java, PHP, etc.

Durch Zufall habe ich soeben ein nettes Tool gefunden, um “mal eben” ein paar Code-Zeilen auszuprobieren, ohne ein Test-Projekt etc. in Visual Studio anlegen zu müssen.

Unterstützt werden diverse Sprachen:

  • Assembly
  • C#
  • C++
  • C
  • Common Lisp
  • Go
  • Haskell
  • Java
  • Javascript
  • Lua
  • Node.js
  • Objective-C
  • Pascal
  • Perl
  • Php
  • Prolog
  • Python
  • Python 3
  • Ruby
  • Scala
  • Scheme
  • Sql Server
  • Visual Basic

del / read, C# – rextester.

Veröffentlicht unter tools | Verschlagwortet mit , , | Hinterlasse einen Kommentar

Ändern der Farbe einer Indeterminate ProgressBar in Windows Store Apps

Um in einer Windows Store App die Vordergrund-Farbe zu ändern, würde wohl jeder im ersten Versuch den Parameter `Foreground` verwenden:

<ProgressBar Foreground="Magenta" IsIndeterminate="True" />

Die Angabe der Farbe im Parameter `Foreground` zeigt jedoch keinerlei Effekt. Um die Farbe anzupassen, muss das Standard-Theme der App angepasst werden, um die Vordergrundfarbe zu überschreiben.

<ResourceDictionary.ThemeDictionaries>
    <ResourceDictionary x:Key="Default">
        <x:String x:Key="ProgressBarIndeterminateForegroundThemeBrush">Magenta</x:String>
    </ResourceDictionary>
</ResourceDictionary.ThemeDictionaries>

Diese Anpassung kann entweder im Standard Style unter `Common/StandardStyles.xaml` oder in einem beliebigen, weiteren Style eingefügt werden. Eigene ResourceDictionarys können in der App.xaml geladen werden.

Veröffentlicht unter xaml | Verschlagwortet mit , , , | Hinterlasse einen Kommentar

Fehlermeldung “Verification of your Teamviewer version failed”

Beim Erst-Start von Teamviewer (sowohl Quicksupport als auch das Voll-Produkt) erschien nun auf meinem Windows 8 PC die folgende Fehlermeldung:

Verification of your Teamviewer version failed
Teamviewer will quit for security reasons. Please reinstall TeamViewer.

Verification of your Teamviewer version failed Teamviewer will quit for security reasons. Please reinstall TeamViewer.

Die Neu-Installation von TeamViewer brachte wie erwartet hier keine Abhilfe – diese Hilfe fand ich aber nach kurzer Suche im Netz. Der Auslöser: es fehlen auf dem lokalen Computer die zur Überprüfung der digitalen Signatur der exe-Datei benötigten Zertifikate. Diese Zertifikate lassen sich jedoch mit wenig Aufwand nachinstallieren:

  1. Öffnen Sie den TeamViewer-Installations-Pfad (je nach TV-Version / Betriebssystem) unter “C:\Program Files\TeamViewer\Version7\ und öffnen die Eigenschaften der Datei teamviewer.exe (Rechtsklick -> Eigenschaften).
  2. Im nun geöffneten Fenster wählen Sie den Reiter “Digitale Signaturen”
  3. Wählen Sie die Signatur in der nun angezeigten Liste und öffnen Sie mit einem Klick auf den entsprechenden Button die Detail-Ansicht.
  4. Im neuen Fenster wählen Sie bitte “Zertifikat anzeigen”.
  5. Klicken Sie im neuen Fenster “Zertifikat installieren”.
  6. Sobald das Zertifikat installiert wurde können alle nun geöffneten Fenster mit einem Klick auf “OK” geschlossen werden.

Die Teamviewer Fernwartungs-Software sollte nun ohne weitere Schwierigkeiten gestartet werden.

Veröffentlicht unter windows | Verschlagwortet mit , , , , | 8 Kommentare

Installation vom SQL 2008 R2 schlägt fehl unter Windows Server 2012

Unter Server 2012 schlägt die Installation von SQL 2008 R2 fehl, da das .Net Framework 3.5 nicht installiert ist.

Das .Net Framework 3.5 lässt sich weder über die Feature-Installation, noch aus der von Microsoft bereitgestellten Setup-Datei installieren.

Unter Windows 2012 muss das .Net-Feature per Cmd-Befehl installiert werden. Dazu wird das Server Installationsmedium benötigt:

    dism ^
        /online ^
        /enable-feature  ^
        /featurename:NetFX3  ^
        /all  ^
        /Source:d:\sources\sxs  ^
        /LimitAccess

In diesem Fall liegt das Installationsmedium unter D:\ – der Parameter “Source” muss falls nötig entsprechend angepasst werden.

Hinweis: Mit dem Zirkumflex (^) werden bei Batch-Befehlen Zeilenumbrüche maskiert, um lange Zeilen zu vermeiden.

Veröffentlicht unter windows | Verschlagwortet mit , , , | Hinterlasse einen Kommentar

Kein IntelliSense nach Installation vom Visual Studio 2008 SDK

Nach der Installation vom Microsoft Visual Studio 2008 SDK (unter Windows 7 x64) funktionierte bereits seit Längerem die IntelliSense für XAML nicht mehr. Indem ich mittlerweile fast alle Projekte in VS 2010 bearbeite, hatte ich das Problem lange aus den Augen verloren. Nach einiger Suche in diversen Foren wurde ich soeben eher zufällig auf eine ziemlich alte, aber genauso simple Lösung aufmerksam:

  • Beenden von Visual Studio
  • Starten der Kommandozeile `cmd` als Administrator
  • Aufrühren des folgenden Befehls:
    regsvr32 "C:\Program Files (x86)\Common Files\microsoft shared\MSEnv\TextMgrP.dll"

Quelle: Intellisense in XAML not working anymore!

Veröffentlicht unter visual studio | Verschlagwortet mit , , | Hinterlasse einen Kommentar

PWGen.php

PWGen.php

Im Bereich “Tools” habe  ich soeben einen Passwort-Generator eingestellt. Diesen verwende ich seit einiger Zeit zum Generieren von Kennwörtern, sowohl manuell als auch in diversen Scripten.

Der Quellcode ist verfügbar unter der GPL.

Veröffentlicht unter tools | Verschlagwortet mit , | Hinterlasse einen Kommentar

Farbmanipulationen in XAML

Für eine Styledefinition war ich heute auf der Suche nach einer Möglichkeit, im XAML-Style eine Farbe “verdunkeln” zu können.
Getreu der Methode des CSS-Frameworks less soll für die Definition nur ein Farbton definiert werden, weitere Akzente sollen dann dunkler bzw. heller dargestellt werden.
Nach einiger Suche kommt dabei ein ValueConverter zum Einsatz, der beim Binding der Farbe diese entsprechend manipulieren kann.
Im folgenden C#-Codebeispiel wird die Farbe als value, sowie optional ein double-Wert als `ConverterParameter` übergeben. In der Methode `Convert` werden alle Farbwerte dann um den angegebenen Faktor reduziert.

using System;
using System.Windows.Data;
using System.Windows.Media;

namespace MyApp.converters
{
    public class DarkenColorConverter : IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {

            // default Reduzierung um 10%
            double percentage = 0.1;
            if (parameter != null)
            {
                double.TryParse((string)parameter, NumberStyles.Any,  CultureInfo.InvariantCulture, out percentage);
            }
            percentage = 1 - percentage;

            if (value is Color)
            {
                Color color = (Color)value;
                return Color.FromRgb((byte)(color.R * percentage), (byte)(color.G * percentage), (byte)(color.B * percentage));
            }
            return value;

        }

        public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            return Colors.Gray;
        }

    }
}

Im XAML Code muss der Converter nun einmalig als Resource geladen werden.

<cnv:DarkenColorConverter x:Key="Darken" />

Anschließend kann dieser wie folgt verwendet werden.

<Window x:Class="MyApp.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:cnv="clr-namespace:MyApp.converters">
    <Window.Resources>
        <cnv:DarkenColorConverter x:Key="Darken" />
        <Color x:Key="Red">#FF0000</Color>
    </Window.Resources>
    <StackPanel>
        <!-- Verwendung des Farbwertes ohne Manipulation -->
        <Grid Background="{Binding Source={StaticResource Red}}">
            <TextBlock>grid 1</TextBlock>
        </Grid>
        <!-- Verwendung der Manipulation mit Standardwert (wird dann um 10% reduziert) -->
        <Grid Background="{Binding Source={StaticResource Red}, Converter={StaticResource ResourceKey=Darken}}">
            <TextBlock>grid 2</TextBlock>
        </Grid>
        <!-- Verwendung der Manipulation mit Angabe des optionalen Parameters -->
        <Grid Background="{Binding Source={StaticResource Red}, Converter={StaticResource ResourceKey=Darken}, ConverterParameter=0.5}">
            <TextBlock>grid 2</TextBlock>
        </Grid>
    </StackPanel>
</Window>

In der Anwendung sieht das ganze dann wie folgt aus.

http://www.dhirtzbruch.de/wp-content/uploads/2013/03/ColorConverter.png

Veröffentlicht unter wpf | Verschlagwortet mit , , | 4 Kommentare