Samstag, 22. Dezember 2012

ChanSort - Channel List Editor for LG and Samsung TVs

Probably nobody at LG's R&D or marketing department ever tried to sort a DVB-S channel list. Using the TV's remote control it would easily take days to do so. Not to mention it has to be done all over again after a new channel scan, which the TV sometimes does on its own.

So I decided to create the program ChanSort, which you can use to sort the channels on your PC. It allows you to rearrange the list and define your favorites.
Details can be found on the project web page at http://beham.biz/ChanSort/

Discussion about the development can be found here: http://www.lg-forum.com/lg-led-plasma-lcd-fernseher/5098-channeleditor-62.html

Update 2012-12-26:
ChanSort can now also edit Samsung Channel Lists (.scm Files)

Donnerstag, 18. Oktober 2012

LG 42LM620S - Unscharfe Schriften und 3D Probleme

Als ich meinen LG 42LM620S erhalten habe und meinen Laptop per HDMI anschloss, fiel mir sofort 2 Dinge auf:
1) rundherum wurden ca. 20 Pixel meines Desktops abgeschnitten
2) Schriften waren so unscharf, wie es typischerweise auftritt, wenn Desktop- und Display-Auflösung nicht identisch sind, was sie aber bei mir waren (1920x1080)

Beim Versuch, ein YouTube 3D-Video abzuspielen, in dem abwechselnd eine Zeile für das link und eine für das rechte Auge dargestellt wird, bekam ich beinahe Kopfweh. Auch hier dürfte die Auflösung skaliert worden sein und durch die Zahlenrundungen wurden dann im Abstand von ca 30 Zeilen aus ungeraden Zeilen gerade und umgekehrt. Als Resultat wurden alle paar Zeilen die nahen Dinge fern und ferne nah.

Nach langem Forschen und Probieren stellte sich folgendes heraus: Der Fernseher verwendet für das Seitenverhältnis standardmäßig die Einstellung "16:9", was bei 1920x1080 eigentlich gegeben ist. Bei dieser Einstellung verwendet der Fernseher allerdings einen Overscan, d.h. er schneidet rundherum 1-2% aus dem Eingangssignal weg und zoomt dann den Rest wieder auf 1920x1080 hoch.

Die Lösung war am TV auf das Seitenverhältnis auf "Just Scan" zu wechseln und in den Einstellungen  meiner ATI-Grafikkarte das GPU Scaling so anzupassen, dass das Display bis in alle Ecken gefüllt wird.

Interessanterweise traten beim Anschluss über ein analoges VGA-Kabel keine Skalierungsprobleme auf.

FritzBox routet private IP Adressen ins Internet

Die Fritz!Box Fon 7170 und andere Modelle leiten überraschenderweise IP-Pakete mit privaten Zieladressen, die nicht im eigenen Subnet liegen, über den WAN Port weiter zum Provider. Erst dort werden sie je nach dessen Infrastruktur nach einem oder mehreren Hops verworfen. Dieses Verhalten ist zwar nicht grundsätzlich falsch, aber in den meisten Fällen vermutlich ungewollt.

Mit einem kleinen Trick kann man erreichen, dass Pakete mit privaten IP-Adressen nicht über den WAN-Port weitergeleitet werden. Dazu geht man in Einstellungen / Erweiterte Einstellungen / System / Netzwerk / IP-Einstellungen / IP-Routen. Dort trägt man für die privaten IP-Bereiche als Gateway eine nicht verwendete IP im eigenen LAN ein. In meinem Fall hat die Fritz!Box die LAN-Adresse 192.168.178.1 und 192.168.178.254 wird nicht verwendet. Die entsprechenden Routen sehen dann so aus:
Netzwerk     Subnetzmaske  Gateway
10.0.0.0     255.0.0.0     192.168.178.254
172.16.0.0   255.240.0.0   192.168.178.254
192.168.0.0  255.255.0.0   192.168.178.254
Starte ich nun ein "tracert 192.168.0.1" erhalte ich nun von meiner FritzBox ein "Zielhost nicht erreichbar". Zuvor ging es über 3 Hops und ca 300km im internen Netz meines Providers, bis das Paket verworfen wurde.

Dienstag, 8. November 2011

Wrong week number in calendar control

Are your European customers complaining about wrong week numbers in calendar controls?

Numbering weeks is different from country to country and therefore information is included in Windows' "locale" settings, which are selected through Control Panel's Region and Language Settings. Control vendors (like DevExpress) use the locale information provided by Windows when displaying week numbers.

Unfortunately, Microsoft doesn't always get it perfectly right. E.g. for locale "de-AT" (Austria) Windows defines the wrong rule "CalendarWeekRule.FirstDay" instead of CalendarWeekRule.FirstFourDayWeek.

To work around this issue you can override your app's locale settings to use the correct rule. I use this code in my main/UI thread to setup the right rule in Austria:


      if (Thread.CurrentThread.CurrentCulture.Name == "de-AT")
      {
        var cultureInfo = new System.Globalization.CultureInfo("de-AT");
        cultureInfo.DateTimeFormat.CalendarWeekRule = System.Globalization.CalendarWeekRule.FirstFourDayWeek;
        Thread.CurrentThread.CurrentUICulture = cultureInfo;
        Thread.CurrentThread.CurrentCulture = cultureInfo;
      }

MouseWheel scrolling

Have you ever tried to scroll a control with the mouse wheel and something else started moving instead? 

The reason for that is that Windows always sends the WM_MOUSEWHEEL message to the control that has the keyboard focus and not as one might assume to the control underneath the mouse cursor.

Windows doesn't provide a means to change this behavior, but there are tools and workarounds. If you have full control over a computer, you can install small programs like "KatMouse" or "WizMouse" to bring universal scroll support to all Windows apps. 

If you develop software and don't have control over the deployment machines, you might want to add universal scroll directly into your app. I did this by implementing IMessageFilter in my main window, intercepting the WM_MOUSEWHEEL message and forward it to the control under the mouse cursor:

using System;
using System.Windows.Forms;

public class MainForm : System.Windows.Forms.IMessageFilter
{
    // .....

    public bool PreFilterMessage(ref Message msg)
    {
      if (msg.Msg == (int)Win32.Msgs.WM_MOUSEWHEEL || msg.Msg == (int)Win32.Msgs.WM_MOUSEHWHEEL)
      {
        // redirect WM_MOUSEWHEEL to the window under the mouse cursor
        int x = (int)(((long)msg.LParam) & 0xFFFF);
        int y = (int)(((long)msg.LParam) >> 16);

        IntPtr handle = Win32.WindowFromPoint(new Point(x, y));
        if (handle != msg.HWnd)
        {
          Win32.SendMessage(handle, (int)msg.Msg, msg.WParam, msg.LParam);
          return true;  // msg won't be processed
        }
      }
      return false;  // msg will be processed normally
    }
}

public static class Win32
{
  public enum Msgs
  {
    WM_MOUSEWHEEL = 0x020A,
    WM_MOUSEHWHEEL = 0x020E,
  }

  [System.Runtime.InteropServices.DllImport("User32.dll", CharSet = System.Runtime.InteropServices.CharSet.Auto)]
  public static extern int PostMessage(IntPtr hWnd, int msg, IntPtr wParam, IntPtr lParam);

  [System.Runtime.InteropServices.DllImport("User32.dll", CharSet = System.Runtime.InteropServices.CharSet.Auto)]
  public static extern int SendMessage(IntPtr hWnd, int msg, IntPtr wParam, IntPtr lParam);

  [System.Runtime.InteropServices.DllImport("User32.dll", CharSet = System.Runtime.InteropServices.CharSet.Auto)]
  public static extern IntPtr WindowFromPoint(System.Drawing.Point screenPoint);
}

RichTextBox loses format

A System.Windows.Forms.RichTextBox control loses the text format when its parent control chain is changed or the visibility of a parent control changes.

This happens in particular when

  • setting the RichTextBox.Rtf property before the control's handle is created
  • the RichTextBox is inside a DevExpress DockingPanel and the panel is re-docked 

A workaround for this is to create a class derived from RichTextBox and override OnFontChanged with an empty method body.