Prozess in den Vordergrund bringen

Die Problemstellung war, nach einem CMD Job welcher den Fokus von einem Fenster genommen hat, diesen wieder auf das Fenster zu setzten und es in den Vordergrund zu bringen. Dazu hab ich mir per C# ein kleines Konsolenprogramm geschrieben welche genau diese Aufgabe übernimmt. Die Verwendung ist ganz einfach:

pf.exe "Name des Prozesses"

Wer Interesse hat dem Programm hat, kann es sich hier direkt als ausführbare Datei herunterladen. Oder mit folgendem Quellcode selber kompilieren:

/// <summary>
/// Try to find process by name and brings the main window to front
/// </summary>
public class Program
{
    #region Constants

    /// <summary>
    /// Restore Mode
    /// </summary>
    const int SwRestore = 9;

    #endregion

    /// <summary>
    /// Try to find process and bring to front
    /// </summary>
    /// <param name="args"></param>
    public static void Main(string[] args)
    {
        // check process name is given as argument
        if (args == null || args.Length < 1)
        {
            Console.WriteLine();
            Console.WriteLine("Syntax: pf.exe Processname");
            Console.WriteLine();
            return;
        }

        // try to find process by name
        Process[] localByName = Process.GetProcessesByName(args[0]);
        // process not found
        if (localByName.Length <= 0)
        {
            Console.WriteLine("ERROR: No process found");
            return;
        }

        // get handle of first process
        var handle = localByName[0].MainWindowHandle;
            
        // check iconic status
        if (IsIconic(handle))
            // show window
            ShowWindow(handle, SwRestore);
        // bring to front
        SetForegroundWindow(handle);
    }

    /// <summary>
    /// Brings window to foreground
    /// </summary>
    /// <param name="hWnd"></param>
    /// <returns></returns>
    [DllImport("User32.dll")]
    private static extern bool SetForegroundWindow(IntPtr hWnd);

    /// <summary>
    /// Shows ionic given window
    /// </summary>
    /// <param name="handle"></param>
    /// <param name="nCmdShow"></param>
    /// <returns></returns>
    [DllImport("User32.dll")]
    private static extern bool ShowWindow(IntPtr handle, int nCmdShow);

    /// <summary>
    /// Check, given window is ionic
    /// </summary>
    /// <param name="handle"></param>
    /// <returns></returns>
    [DllImport("User32.dll")]
    private static extern bool IsIconic(IntPtr handle);
}

Remote Desktop von einen High-DPI Monitor

Ich besitze einen Laptop mit einem High-DPI Monitor. Dank der DPI-Skalierung von Windows haben alle Elemente die gewünschte und gewohnte Größe und es lässt sich prima damit arbeiten. Zusätzlich ist alles deutlich schärfer und gerade Text lässt sich besser lesen.

Probleme gibt es jedoch wenn man per Remote Desktop auf einen Server zugreifen muss, welcher das ganze nicht unterstützt. Dann muss man mit der Lupe irgendwelche winzige Buttons und Texte versuchen zu entziffern, den die Auflösung wird zwar an die lokale angepasst, jedoch nicht die Skalierung.

Abhilfe schafft hier der Remote Desktop Connection Manager von Microsoft.

  • Remote Desktop Connection Manager herunterladen
  • Installieren und anschließend starten
  • File-> New
  • Der Servergruppe einen beliebigen Namen geben, z. B. „MeineServer.grp“
  • Speicherort wählen und mit Speichern bestätigen
  • Im der Linken Liste das Kontext-Menü öffnen und „Add Server“ auswählen. Sollte eine Hinweisbox erscheinen, diese mit Ja bestätigen
  • Servername und Displayname vergeben und evtl. die Logon-Credentials eintragen
  • Danach den „Remote Desktop Settings“ Tab öffnen, den Haken „Inherhit from parent“ entfernen und bei der Remote Desktop Size „Full Screen“ auswählen.
Remote Desktop Settings

Remote Desktop Connection Manager – Remote Desktop Settings

  • Mittels „Add“ den Server hinzufügen
  • Der Server sollte nun als Eintrag unter der Gruppe in der linken Spalte aufgelistet sein. Doppelklicken um eine Verbindung zum Server aufzubauen.
  • Session -> Fullscreen um in die gewohnte Remote-Desktop Ansicht zu wechseln.

CSS Puns & Css Jokes

Mal was witziges für zwischendurch: CSS Puns & Css Jokes

dynamic Parameter in MVC5 Action

Ich hatte das Problem, bei einer Action einen Parameter vom Typ „dynamic“ übergeben zu müssen, da die übergebenen Daten unterschiedlich waren. Für alle Möglichkeiten ein eigenes Model anzulegen war meiner Meinung nach zu unpraktisch. Leider hat das nicht auf anhieb funktioniert. Es wurde immer ein leeres Objekt vom Typ „object“ übergeben. Abhilfe schafft ein eigener ModelBinder:

public class DynamicModelBinder : IModelBinder
{
    public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
    {
        if (!controllerContext.HttpContext.Request.ContentType.StartsWith("application/json", StringComparison.OrdinalIgnoreCase))
            return null;

        controllerContext.HttpContext.Request.InputStream.Position = 0;
        using (var reader = new StreamReader(controllerContext.HttpContext.Request.InputStream))
        {
            // read in
            var json = reader.ReadToEnd();
            if (string.IsNullOrEmpty(json))
                return null;

            // deserialize json string to dynamic object
            return JsonConvert.DeserializeObject<dynamic>(json);
        }
    }
}

Anschließend noch im Application_Start registrieren

ModelBinders.Binders.Add(typeof(object), new DynamicModelBinder());

Und schon werden dynamic-Parameter richtig angenommen.

Eigene Fehlerseiten in MVC5

Man findet im Netz viele Fragen und auch viele Lösungen zu eigenen 404 Fehlerseiten mit MVC5. Soviel Antworten wie es gibt, soviel Fehlschläge gibt es jedoch auch. Ich hatte bisher keine Lösung gefunden die mich wirklich zufrieden gestellt hat. Entweder war sie super kompliziert und aufwendig, hat nicht alle Fälle abgedeckt oder komische URLs sind dabei herausgekommen. Eine sehr gute Hilfe für mich war der Beitrag von Ben Foster welcher mich auch zu meiner Lösung geführt hat.

Als erstes legt man einen neuen Controller mit einer Action für den 404 Fehler an. Namen können beliebig gewählt werden.

/// <summary>
/// Handles error pages
/// </summary>
public class ErrorController : Controller
{
	/// <summary>
	/// 404 - Not Found
	/// </summary>
	/// <returns></returns>
	public ActionResult NotFound()
	{
		// set status code
		Response.StatusCode = 404;
		// show view
		return View();
	}
}

Anschließend muss noch in der Web.config unter der System.webServer Sektion das Error Handling eingetragen werden.

<httpErrors errorMode="Custom" existingResponse="Replace">
	<remove statusCode="404" />
	<error statusCode="404" path="/Error/NotFound" responseMode="ExecuteURL" />
</httpErrors>

Unter Path muss der entsprechende Controller und Action Name verwendet werden.

SQL Server: Anzahl der Rows aller Tabellen

Oft benötigt man die gesamte Anzahl an Rows einer Tabelle. Wenn diese sehr Groß ist, kann ein SELECT COUNT(*) problematisch werden. Zum einen dauert dieser dann sehr lang und erzeugt auch eine gewisse Last auf dem Server. Als Alternative bietet sich hier die dynamische View „sys.dm_db_partition_stats“ des SQL Servers an, welche diese Information bereithält.

Um die Anzahl der Rows aller Tabelle anzuzeigen reicht folgendes SQL Statement:

SELECT so.name as TableName, ddps.row_count as [RowCount]
FROM sys.objects AS so
	JOIN sys.indexes AS si ON si.OBJECT_ID = so.OBJECT_ID
	JOIN sys.dm_db_partition_stats AS ddps ON si.OBJECT_ID = ddps.OBJECT_ID  AND si.index_id = ddps.index_id
WHERE si.index_id < 2  AND so.is_ms_shipped = 0
ORDER BY ddps.row_count DESC

Linktipp: X to Close

Interessanter Artikel über den Ursprung des „X“ zum schließen eines Fensters. X to Close – The origins of the use of [x] in UI design

Linktipp: Can We Trust the Libraries We Use?

Ein erneuter Linktipp von viva64: Can We Trust the Libraries We Use?. Sehr lesenswert für alle Entwickler welche sich auf Bibliotheken von Drittherstellern verlassen (müssen).

WP8.1: ListViewItem auf volle Breite

In Windows Phone 8.1 wurde als neues List-Control die ListView eingeführt. Diese verhält sich jedoch etwas anders als die alte ListBox. Bei dieser konnte man noch mit folgendem XAML-Code ein ListBox-Item auf volle Breite Strecken:

<ListBox HorizontalContentAlign="Stretch" />

Bei der ListView funktioniert das nicht mehr. Hier muss man stattdessen den ItemContainerStyle bearbeiten und dort das HorizontalContentAlignment-Property auf Stretch setzen.

<ListView>
    <ListView.ItemContainerStyle>
        <Style TargetType="ListViewItem">
            <Setter Property="HorizontalContentAlignment" Value="Stretch" />
        </Style>
    </ListView.ItemContainerStyle>
</ListView>

Linktipp: The Last Line Effect

Interessanter Blogeintrag über den „Last Line Effect“. Zeigt anhand von Beispielen dass die Fehlerquote in der letzten Codezeile durch Copy & Pase 4 mal höher ist als sonst.

The Last Line Effect