2011年9月25日日曜日

firefoxの起動を確かめるソフトをまた使うことに

以前、firefoxの起動を確かめるソフトをwin32sdkで作成しました。 古いWindowsXPのPCを使っていたときの話です。 2ヶ月前にWindows7のPCを買って、Firefoxの起動はとても早くなりました。 もうそのソフトは不要だと思っていました。

しかし、しばらく使っているとFirefoxはどんどん起動が遅くなっていきます。 いったいどうなっているんでしょうね? 結局起動確認用のソフトをまた引っ張り出してくるハメに。

前のPCで使っていたソフトをそのままFirefoxのフォルダにコピーすればいいと思っていたら、セキュリティーの警告がでました。 そうだった。 Windows7ではProgram Filesにコピーするとそうなるんでしたよね。 警告を無視してコピーしても、毎回起動するたびに警告が出るんでしたっけ? ホントに警告が出るかはうろ覚えです。 それを確認するのもすぐだけど、コンパイルし直すのもすぐだなぁ。

ってことで以前作ったコードを書き直して、Firefoxのパスをフルパスにしてコンパイルすることに。

前のPCは性能が低いせいでVisual C++がインストールできませんでした。 Visual C++の代わりにBorland C++ Compiler 5.5でコンパイルしてました。 今回はVisual C++ 2010 Expressが使えます。 ライブラリの扱いがちょっとだけ違うのでそれを書き直してコンパイルです。

レジストリを使っていないフリーソフトはProgram Files以外のフォルダに入れてるんですが、そこにFirefox起動確認ソフトもコピー。 ちゃんと動くことを確認できました。

なんつーか、退化完了?

// RunFirefox.cpp
#include <windows.h>
#include <mmsystem.h>
#include <tchar.h>

#pragma comment(lib, "Winmm.lib")

#define WINDOW_WIDTH   (512)
#define WINDOW_HEIGHT  (384)
#define ID_TIMER       (32767)
#define TIMER_INTERVAL (500)
#define WAV_FILE_NAME      (_T("run.wav"))
#define BMP_FILE_NAME      (_T("run.bmp"))
#define EXE_FILE_NAME      (_T("C:\\Program Files (x86)\\Mozilla Firefox\\firefox.exe"))
#define APP_CLASS_NAME     (_T("RunFirefox"))
#define FIREFOX_CLASS_NAME (_T("MozillaWindowClass"))

BOOL    RegisterAppClass(HINSTANCE hInst);
BOOL    CreateAppWindow(HINSTANCE hInst, int nCmdShow);
LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp);

int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR lpsCmdLine, int nCmdShow)
{
    MSG msg;

    if(!RegisterAppClass(hInst) )
        return FALSE;
    if(!CreateAppWindow(hInst, nCmdShow) )
        return FALSE;

    while(GetMessage(&msg, NULL, 0, 0) )
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }

    return FALSE;
}

BOOL RegisterAppClass(HINSTANCE hInst)
{
    WNDCLASS wc;
    wc.style         = CS_HREDRAW | CS_VREDRAW;
    wc.lpfnWndProc   = WndProc;
    wc.cbClsExtra    = 0;
    wc.cbWndExtra    = 0;
    wc.hInstance     = hInst;
    wc.hIcon         = NULL;
    wc.hCursor       = LoadCursor(NULL, IDC_ARROW);
    wc.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH);
    wc.lpszMenuName  = NULL;
    wc.lpszClassName = APP_CLASS_NAME;
    
    return RegisterClass(&wc);
}

BOOL CreateAppWindow(HINSTANCE hInst, int nCmdShow)
{
    HWND hWnd;
    
    hWnd = CreateWindow(
        APP_CLASS_NAME,
        APP_CLASS_NAME,
        WS_POPUP,
        (GetSystemMetrics(SM_CXSCREEN) - WINDOW_WIDTH ) / 2,
        (GetSystemMetrics(SM_CYSCREEN) - WINDOW_HEIGHT) / 2,
        WINDOW_WIDTH,
        WINDOW_HEIGHT,
        NULL,
        NULL,
        hInst,
        NULL);
    
    if(!hWnd)
        return FALSE;
    
    ShowWindow(hWnd, nCmdShow);
    UpdateWindow(hWnd);
    return TRUE;
}

LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp)
{
    static HBITMAP hBitmap    = NULL;
    static HDC     hBitmapDC  = NULL;
    HWND hFirefoxWnd = NULL;
    HDC  hDC = NULL;
    PAINTSTRUCT ps;
    
    switch( msg )
    {
    case WM_CREATE:
        ShellExecute(NULL, _T("open"), EXE_FILE_NAME, NULL, NULL, SW_SHOW);
        hBitmap = (HBITMAP)LoadImage(NULL, BMP_FILE_NAME, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
        hBitmapDC = CreateCompatibleDC(NULL);
        SelectObject(hBitmapDC, hBitmap);
        PlaySound(WAV_FILE_NAME, NULL, SND_ASYNC | SND_FILENAME);
        SetTimer(hWnd, ID_TIMER, TIMER_INTERVAL, NULL);
        break;
    case WM_TIMER:
        hFirefoxWnd = FindWindow(FIREFOX_CLASS_NAME, NULL);
        if(hFirefoxWnd && IsWindowVisible(hFirefoxWnd) )
        {
            KillTimer(hWnd, ID_TIMER);
            DestroyWindow(hWnd);
        }
        break;
    case WM_PAINT:
        hDC = BeginPaint(hWnd, &ps);
        BitBlt(hDC, 0, 0, WINDOW_WIDTH, WINDOW_HEIGHT, hBitmapDC, 0, 0, SRCCOPY);
        EndPaint(hWnd, &ps);
        break;
    case WM_LBUTTONDOWN:
    case WM_LBUTTONUP:
    case WM_DESTROY:
        DeleteObject(hBitmap);
        DeleteDC(hBitmapDC);
        KillTimer(hWnd, ID_TIMER);
        PostQuitMessage(0);
        return 0;
    }

    return DefWindowProc(hWnd, msg, wp, lp);
}

強調表示したところを前のコードから書き換えました。 あと、使ってない変数が1つ残っていたので消しました。