Show MS-IME9 のソース

ShowIME9 の cpp ソースです。
なお、VC++6 用の すべてのプロジェクトファイルは [ こちら(18.6KB / *.CAB) ] からダウンロードできます。
ちなみに、プロジェクトファイルは ShowIME9.exe という名称ではないのでご注意!

showime2k4win2k.cpp


// showIME2k4Win2k.cpp : アプリケーション用のエントリ ポイントの定義
//

#include "stdafx.h"
#include <stdio.h>
#include <stdlib.h>
#include "resource.h"

#define D_APPNAME   "Show MS-IME98/200x for Windows98/2000"
#define D_HPURL     "http://ir9.jp/"
#define D_Name      "作者 : いろきゅう"

#define D_CANCEL        0xffffff
#define D_ErrorCheckBox 0xffff00
enum ErrorEnum
{
    NotIME2000Error,
    RegOpenError,
    RegSetError
};

enum IMEType
{
    NONIME,
    IME98,
    IME2000,
    IME2002
} g_IMEType = NONIME;

char    g_szIMEType[5]; // 2000 or 98 String
int     g_nRegValue;

void FindMSIME();
HRESULT CALLBACK DlgProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp);

int APIENTRY WinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPSTR     lpCmdLine,
                     int       nCmdShow )
{
    // TODO: この位置にコードを記述してください。

    HKEY    hRegKey = NULL;
    DWORD   nRegKeyType;
    DWORD   nRegValueSize = 256;

    try
    {
        BYTE    szRegValue[256];
        int     nRetValue;
        // OS チェック
        OSVERSIONINFO os;
        os.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
        GetVersionEx(&os);

        FindMSIME();

        if(g_IMEType == NONIME)
            throw(NotIME2000Error);

        if(RegOpenKeyEx(HKEY_CURRENT_USER,"Control Panel\\Input Method",0,KEY_READ | KEY_SET_VALUE,&hRegKey) != ERROR_SUCCESS)
            throw(RegOpenError);    // レジストリがオープンできません。

        // 値の取得
        if(RegQueryValueEx(hRegKey,"Show Status",0,&nRegKeyType,szRegValue,&nRegValueSize) != ERROR_SUCCESS)
            throw(RegOpenError);

        g_nRegValue = atoi((char*)szRegValue);

        // ダイアログの呼び出し
        if((nRetValue = DialogBox(hInstance,(LPCTSTR)IDD_DIALOG1,NULL,(DLGPROC)DlgProc)) != D_CANCEL)
        {   // OKボタンが押されたら
            if(nRetValue != g_nRegValue)
            {   // 値が違っていたら
                sprintf((char*)szRegValue,"%1d",nRetValue);
                nRegValueSize = strlen((char*)szRegValue);
                RegSetValueEx(hRegKey,"Show Status",0,nRegKeyType,szRegValue,nRegValueSize);

                // 再起動の要求 
                int   nOsType = ((os.dwPlatformId == VER_PLATFORM_WIN32_NT) ? 0 : 1);
                char *szDlgStr[] =
                {
                    {"設定を変更しました。\n\n設定を反映するには、ログオフする必要があります。\n今すぐ、ログオフしますか?"},
                    {"設定を変更しました。\n\n設定を反映するには、再起動する必要があります。\n今すぐ、再起動しますか?"},
                };

                if(MessageBox(GetDesktopWindow(),szDlgStr[nOsType],D_APPNAME,MB_YESNO | MB_ICONQUESTION) == IDYES)
                {   // 良くないプログラミングだ…(^^ ;;
                    ExitWindowsEx(nOsType ? EWX_REBOOT : EWX_LOGOFF , NULL);
                }
            }
        }
    }
    catch(ErrorEnum e)
    {
        char    str[1024];
        switch(e)
        {
        case NotIME2000Error:
            {
                strcpy(str,"お使いの オペレーティングシステム内に \"MS-IME98\",\"MS-IME2000\" または \"MS-IME2002\" が見つかりません。");
            }
            break;
        case RegOpenError:
            {   // レジストリキー 開けませんでした。
                strcpy(str,"IMEの表示設定をするべきレジストリキーが開けませんでした。");
            }
            break;
        case RegSetError:
            {   // レジストリキー 開けませんでした。
                strcpy(str,"IMEの表示設定をするべきレジストリキーの設定が変更できませんでした。");
            }
            break;
        }
        MessageBox(GetDesktopWindow(),str,D_APPNAME,MB_OK | MB_ICONSTOP);
    }

    if(hRegKey)     RegCloseKey(hRegKey);

    return 0;
}

void FindMSIME()
{
    char    szSystemDirectory[MAX_PATH];
    HANDLE  hFind = NULL;
    WIN32_FIND_DATA fd;

    // MS-IME 98 の検索
    GetSystemDirectory(szSystemDirectory,MAX_PATH); // システムディレクトリの取得
    strcat(szSystemDirectory,"\\imejp98m.exe");
    hFind = FindFirstFile(szSystemDirectory,&fd);
    if(hFind != INVALID_HANDLE_VALUE)
    {
        g_IMEType   = IME98;
        strcpy(g_szIMEType,"98");
    }
    FindClose(hFind);

    // MS-IME 2000 の検索
    GetSystemDirectory(szSystemDirectory,MAX_PATH); // システムディレクトリの取得
    strcat(szSystemDirectory,"\\imejpmgr.exe");
    hFind = FindFirstFile(szSystemDirectory,&fd);
    if(hFind != INVALID_HANDLE_VALUE)
    {
        g_IMEType   = IME2000;
        strcpy(g_szIMEType,"2000");
    }
    FindClose(hFind);

    // MS-IME 2002 の検索   // なんでか、コレだけレジストリから検索(w
    HKEY    hRegKey = NULL;
    if(RegOpenKeyEx(HKEY_LOCAL_MACHINE,"SOFTWARE\\Microsoft\\IMEJP\\8.0",0,KEY_READ,&hRegKey) == ERROR_SUCCESS)
    {
        g_IMEType   = IME2002;
        strcpy(g_szIMEType,"2002");
    }
    RegCloseKey(hRegKey);
}


HRESULT CALLBACK DlgProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp)
{
    switch(msg)
    {
    case WM_INITDIALOG:
        {
            char szStr[50];
            sprintf(szStr,"MS-IME%s ツールバーの設定",g_szIMEType);
            SetDlgItemText(hWnd,IDC_STATIC_Waku,szStr);

            SetDlgItemText(hWnd,IDC_EDIT_Name,D_Name);
            SetDlgItemText(hWnd,IDC_EDIT_URL,D_HPURL);

            switch(g_nRegValue)
            {
            case 0:
                SendMessage(GetDlgItem(hWnd,IDC_RADIO_Hidden),BM_SETCHECK,1,0); break;
            case 1:
                SendMessage(GetDlgItem(hWnd,IDC_RADIO_Disp),BM_SETCHECK,1,0);   break;
            }
        }
        break;
    case WM_COMMAND:
        {
            switch(LOWORD(wp))
            {
            case IDOK:
                {
                    DWORD   nGetParam = D_ErrorCheckBox;
                    // なんか、すごい書き方してるな、オイ。(爆
                    if(SendMessage(GetDlgItem(hWnd,IDC_RADIO_Hidden),BM_GETCHECK,0,0) == BST_CHECKED)
                        nGetParam = 0;
                    if(SendMessage(GetDlgItem(hWnd,IDC_RADIO_Disp),BM_GETCHECK,0,0) == BST_CHECKED)
                        nGetParam = 1;
                    
                    if(nGetParam == D_ErrorCheckBox)
                    {
                        MessageBox(hWnd,"MS-IME のツールバーを、表示するかしないかの選択がされていません。\nどちらかを選択してください。",D_APPNAME,MB_OK | MB_ICONSTOP);
                    }
                    else
                    {
                        EndDialog(hWnd,nGetParam);
                    }
                }
                break;
            case IDCANCEL:
                {
                    EndDialog(hWnd,D_CANCEL);
                }
                break;
            }
        }
        break;
    }
    return false;
}

▲このページのTOP▲