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