しばやん雑記

Azure とメイドさんが大好きなフリーランスのプログラマーのブログ

Quick Look っぽく表示する WinQuickLook を更新しました

三連休の最終日は引きこもって、一昨日公開した Quick Look っぽく表示するアプリこと WinQuickLook を更新していました。名前は仮のつもりでしたが、新しく考えるのがめんどくさくなったのでこのままにします。

まだバージョニングしてませんが、多分これが v0.1 に相当するものだと思います。

http://shibayan.blob.core.windows.net/apps/WinQuickLook.zip
https://github.com/shibayan/WinQuickLook/releases

COM のリソースリークっぽい部分を修正したり、プレビュー可能ファイルの種類を増やしたり、プレビューのサイズがプライマリウィンドウからはみ出さないようにしたりと、細かい修正を行っています。

今日アップデートした中でも、分かりやすい部分だけ簡単に紹介しておきます。

テキスト、HTML ファイルのプレビュー

WPF の WebBrowser コントロールを使って、テキストや HTML のプレビューが出来るようになりました。

Markdown も一応表示できるようにしてますが、HTML へのレンダリングは行いません。

個人的には C# や C++ などのソースコードを色付けして表示まで出来ればいいと思っているので、良い感じに表示するライブラリがあれば考えます。

デスクトップでのプレビュー

これまではエクスプローラで表示していたファイルのみに対応していましたが、デスクトップ上のファイルに対してもプレビュー表示ができるようになりました。

ちなみにデスクトップの COM インスタンスを取得するには IShellWindows の FindWindowSW を使います。

更に GetForegroundWindow で取得したウィンドウがデスクトップなのか判別するために、以下のようなメソッドを作りました。ウィンドウクラス名で判別するようにします。

private static bool IsDesktopWindow(IntPtr hwnd)
{
    var classNameBuilder = new StringBuilder(Consts.MAX_PATH);

    NativeMethods.GetClassName(hwnd, classNameBuilder, Consts.MAX_PATH);

    var className = classNameBuilder.ToString();

    if (className != "Progman" && className != "WorkerW")
    {
        return false;
    }

    return NativeMethods.FindWindowEx(hwnd, IntPtr.Zero, "SHELLDLL_DefView", null) != IntPtr.Zero;
}

Space キーが押されたとき、このメソッドを使って FindWindowSW を使うのかコレクションから取得するのかを決めます。IWebBrowserApp を取得してしまえば、後の処理は全く同じなので共通化できます。