Fast View braucht einen Neuanfang

Nachdem ich in den letzten Tagen endlich mal wieder ein paar Stunden für Fast View gefunden habe, hat sich herausgestellt, dass der Code viel zu unübersichtlich und verschachtelt ist. Kleine Kostprobe gefällig?

private static IntPtr _hookID = IntPtr.Zero;
 private static LowLevelKeyboardProc _proc = new LowLevelKeyboardProc(InterceptKeys.HookCallback);
 private static Form1 form;
 private const int WH_KEYBOARD_LL = 13;
 private const int WM_KEYDOWN = 0x100;

 [DllImport("user32.dll", CharSet=CharSet.Auto, SetLastError=true)]
 private static extern IntPtr CallNextHookEx(IntPtr hhk, int nCode, IntPtr wParam, IntPtr lParam);
 private static string GetExplorerPath()
 {
 try
 {
 ShellWindows shellWindows = new ShellWindowsClass();
 int foregroundHandle = GetForegroundWindow().ToInt32();
 foreach (InternetExplorer ie in shellWindows)
 {
 if (ie.HWND == foregroundHandle)
 {
 return ((IShellFolderViewDual2) ie.Document).FocusedItem.Path;
 }
 }
 }
 catch (Exception)
 {
 return null;
 }
 return null;
 }

 [DllImport("user32.dll", CharSet=CharSet.Auto, SetLastError=true)]
 private static extern IntPtr GetForegroundWindow();
 [DllImport("user32.dll")]
 [return: MarshalAs(UnmanagedType.Bool)]
 static extern bool SetForegroundWindow(IntPtr hWnd);
 [DllImport("kernel32.dll", CharSet=CharSet.Auto, SetLastError=true)]
 private static extern IntPtr GetModuleHandle(string lpModuleName);
 private static IntPtr HookCallback(int nCode, IntPtr wParam, IntPtr lParam)
 {
 if (((nCode >= 0) && (wParam == ((IntPtr) 0x100))) && (Marshal.ReadInt32(lParam) == 0x20))
 {
 form.SpacePressed(GetExplorerPath());
 }
 return CallNextHookEx(_hookID, nCode, wParam, lParam);
 }

Weiterlesen

.NET Tricks Teil 2

Mal wieder gibt es Tipps&Tricks zu .Net zu berichten. Nachdem ich letztes Mal über die Klasse Path geschrieben habe, geht es diesmal um statische Konstruktoren. Wer kennt das nicht:

public static void Init() {  }

Alle möglichen Helper Klassen haben Init() Methoden. Und wenn man dann doch mal vergisst die aufzurufen… 😉 In „normalen“ Klassen würde man solche Arbeiten im Konstruktor erledigen, aber für manche Dinge sind statische Klassen einfach besser. Ich habe z.B. in tKoD einen ScriptingManager, einen NetworkManager, usw. Und dementsprechend auch eine lange Liste von Init() Aufrufen am Anfang meines Spiels. Aber daran haben die Macher von .Net gedacht! Denn es gibt statische Konstruktoren! Sie werde durch folgende Anweisung deklariert:

class Foo
{
static Foo()
{
//statischer Konstruktor
}
}

Weiterlesen

.NET Tricks Teil 1

Ich werde immer mal wieder kleine Tricks veröffentlichen, die mir so über den Weg laufen (oder mir selber einfallen…)

Heute: Die Klasse Path!

Wer kennt das nicht: man hat einen Pfad und möchte nur den Dateiname haben. Natürlich gibt es viele einfache Möglichkeiten:

Nr. 1: String.Split()

string path = @"C:OrdnerTest.abc";
string[] split = path.Split(new char[]{''});
string filename = split[split.Lenght - 1];

Nachteil: 2 Zeilen Code, sowie 2 überflüssige Arrays! Das belastet den Gabage Collector wenn das öffter macht!

Nr. 2 FileInfo

string path = @"C:OrdnerTest.abc";
FileInfo fi = new FileInfo(path);
string filename = fi.Filename;

Nachteil: Wie oben ein überflüssiges Objekt. Ich weiss, man könnte das Object gloabl halten, aber trotzdem sind es 2 Zeilen Code!

Weiterlesen