正在阅读:自制王码五笔型输入法安装包自制王码五笔型输入法安装包

2005-02-01 10:15 出处: 作者:张伟 责任编辑:huangpeidan

  9. 适当调整控件的大小和位置,完成资源创建(如图11):

  10. 通过菜单Project - Add to Project - New添加一个“C++ Source File”代码文件,命名为“WINWB”(如图12):

  11. 在新添加“WINWB.CPP”文件中输入程序代码,代码如下:

#include <windows.h>
#include "resource.h"

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

#define IME_WINWB86  0
#define IME_WINWB98  1

BOOL  CALLBACK  Main_DlgProc(HWND, UINT, WPARAM, LPARAM);

LPCTSTR  TranslateFileName(LPCTSTR);
void  InstallIME(int);

int WINAPI WinMain(HINSTANCE  hInstance,
       HINSTANCE  hPrevInstance,
       LPSTR  lpCmdLine,
       int    nShowCmd)
{
  DialogBox(hInstance, (LPCTSTR)IDD_MAIN, NULL, Main_DlgProc);
  return 0;
}

//
// 函数名:Main_DlgProc
//
// 参  数:hDlg - 对话框句柄
//         uMsg - 消息值
//         wParam、lParam - 消息参数
//
// 返回值:TRUE  - 消息已处理
//         FALSE - 消息未处理,返回给默认对话框处理程序处理
//
// 备  注:对话框IDD_MAIN的回调函数
//
BOOL CALLBACK Main_DlgProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
  TCHAR  strWINWB86[] = "王码五笔型输入法86版";
  TCHAR  strWINWB98[] = "王码五笔型输入法98版";

  
  TCHAR  cBuf[30];  // 存放LISTBOX中ITEM文本的缓冲区
  int  nBuf[2];  // 存放LISTBOX中被选中的ITEM索引号的缓冲区
  int  nSel;    // LISTBOX中被选种的ITEM的数目

  switch (uMsg)
  {
  case WM_INITDIALOG:
    // 初始化LISTBOX
    SendDlgItemMessage(hDlg, IDC_LIST, LB_ADDSTRING, 0, (LPARAM)strWINWB86);
    SendDlgItemMessage(hDlg, IDC_LIST, LB_ADDSTRING, 0, (LPARAM)strWINWB98);
    return TRUE;

  case WM_COMMAND:
    switch (LOWORD(wParam))
    {
    // 响应“退出”按钮
    case IDCANCEL:
      EndDialog(hDlg, 0);
      return TRUE;

    // 响应“添加”按钮
    case IDOK:
      // 获取LISTBOX中被选中的ITEM的数目及索引号
      nSel = SendDlgItemMessage(hDlg, IDC_LIST, LB_GETSELITEMS, 2, (LPARAM)nBuf);

      if (nSel == 0)
      {
        MessageBox(hDlg, "请选择输入法版本!", "提示信息", MB_OK);
        return TRUE;
      }

      for (-- nSel; nSel >= 0; nSel --)
      {
        // 获取LISTBOX中该索引号对应的ITEM的文本
        SendDlgItemMessage(hDlg, IDC_LIST, LB_GETTEXT, nBuf[nSel], (LPARAM)cBuf);

        if (lstrcmp(cBuf, strWINWB86) == 0)
        {
          InstallIME(IME_WINWB86);  // 安装王码五笔型输入法86版
        }
        else if (lstrcmp(cBuf, strWINWB98) == 0)
        {
          InstallIME(IME_WINWB98);  // 安装王码五笔型输入法98版
        }
      }

      return TRUE;
    }

  default:
    return FALSE;
  }
}

TCHAR g_strFileName[MAX_PATH];  // 函数TranslateFileName用到的字符串缓冲区

//
// 函数名:TranslateFileName
//
// 参  数:lpszFileName - 指向用相对路径表示的文件名的字符串指针
//
// 返回值:指向用绝对路径表示的文件名的字符串指针
//
// 备  注:将以WINDOWS目录为基准的用相对路径表示的文件名转换成用绝对路径表示的文件名
//
LPCTSTR TranslateFileName(LPCTSTR lpszFileName)
{
  // 获取WINDOWS目录的路径
  GetWindowsDirectory(g_strFileName, MAX_PATH);

  // 如果WINDOWS目录的路径是根目录
  if (g_strFileName[lstrlen(g_strFileName)-1] == '\\')
  {
    // 去掉路径最后的“\”
    g_strFileName[lstrlen(g_strFileName)-1] = '\0'; 
  }

  // 连接WINDOWS目录路径和用相对路径表示的文件名
  lstrcat(g_strFileName, lpszFileName);

  return g_strFileName;
}

//
// 函数名:InstallIME
//
// 参  数:nIMEType - 输入法类型
//
// 返回值: 无
//
// 备  注:安装指定的输入法
//
void InstallIME(int nIMEType)
{
  TCHAR  strWINWB86A[] = "王码五笔型86版";
  TCHAR  strWINWB86W[] = "中文 (简体) - 王码五笔型86版";

  TCHAR  strWINWB98A[] = "王码五笔型98版";
  TCHAR  strWINWB98W[] = "中文 (简体) - 王码五笔型98版";

  HKL  hKL;

  if (nIMEType == IME_WINWB86)
  {
    // 复制输入法帮助文件
    CopyFile("WINWB86.HLP", TranslateFileName("\\HELP\\WINWB86.HLP"), FALSE);
    CopyFile("WINWB86.CHM", TranslateFileName("\\HELP\\WINWB86.CHM"), FALSE);
    CopyFile("WINWB86.CNT", TranslateFileName("\\HELP\\WINWB86.CNT"), FALSE);

    if (GetVersion() < 0x80000000)  // NT/2000/XP系统
    {
      // 复制UNICODE版输入法文件
      CopyFile("WINWB86W.IME", TranslateFileName("\\SYSTEM32\\WINWB86.IME"), FALSE);
      CopyFile("WINWB86W.MB", TranslateFileName("\\SYSTEM32\\WINWB86.MB"), FALSE);

      // 安装UNICODE版输入法
      hKL = ImmInstallIME(TranslateFileName("\\SYSTEM32\\WINWB86.IME"), strWINWB86W);
    }
    else  // 9X/ME系统
    {
      // 复制ANSI版输入法文件
      CopyFile("WINWB86A.IME", TranslateFileName("\\SYSTEM\\WINWB86.IME"), FALSE);
      CopyFile("WINWB86A.MB", TranslateFileName("\\SYSTEM\\WINWB86.MB"), FALSE);

      // 安装ANSI版输入法
      hKL = ImmInstallIME(TranslateFileName("\\SYSTEM\\WINWB86.IME"), strWINWB86A);
    }

    // 验证输入法句柄是否有效
    if (ImmIsIME(hKL)) 
    {
      MessageBox(NULL, "安装王码五笔型输入法86版成功!", "提示信息", MB_OK);
    }
    else
    {
      MessageBox(NULL, "安装王码五笔型输入法86版失败!", "提示信息", MB_OK);
    }
  }
  else if (nIMEType == IME_WINWB98)
  {
    CopyFile("WINWB98.HLP", TranslateFileName("\\HELP\\WINWB98.HLP"), FALSE);
    CopyFile("WINWB98.CHM", TranslateFileName("\\HELP\\WINWB98.CHM"), FALSE);
    CopyFile("WINWB98.CNT", TranslateFileName("\\HELP\\WINWB98.CNT"), FALSE);

    if (GetVersion() < 0x80000000)
    {
      CopyFile("WINWB98W.IME", TranslateFileName("\\SYSTEM32\\WINWB98.IME"), FALSE);
      CopyFile("WINWB98W.MB", TranslateFileName("\\SYSTEM32\\WINWB98.MB"), FALSE);

      hKL = ImmInstallIME(TranslateFileName("\\SYSTEM32\\WINWB98.IME"), strWINWB98W);
    }
    else
    {
      CopyFile("WINWB98A.IME", TranslateFileName("\\SYSTEM\\WINWB98.IME"), FALSE);
      CopyFile("WINWB98A.MB", TranslateFileName("\\SYSTEM\\WINWB98.MB"), FALSE);

      hKL = ImmInstallIME(TranslateFileName("\\SYSTEM\\WINWB98.IME"), strWINWB98A);
    }

    if (ImmIsIME(hKL)) 
    {
      MessageBox(NULL, "安装王码五笔型输入法98版成功!", "提示信息", MB_OK);
    }
    else
    {
      MessageBox(NULL, "安装王码五笔型输入法98版失败!", "提示信息", MB_OK);
    }
  }

键盘也能翻页,试试“← →”键

关注我们

最新资讯离线随时看 聊天吐槽赢奖品