一些技巧(13)

本文介绍了一个输入法程序(IME)的实现方法,包括如何获取已安装的输入法列表及属性,以及开发输入法所需的导出函数。展示了通过C++实现的具体代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

//取得输入法
DWORD dwSize;
DWORD dwi;
HKL hKL=0;
HKL *lphkl;
CString Buff;
dwSize=GetKeyboardLayoutList(0,NULL);
lphkl=(HKL*)GlobalAlloc(GPTR,dwSize*sizeof(DWORD));
if(!lphkl)
   return NULL;
GetKeyboardLayoutList(dwSize,lphkl);
for(dwi=0;dwi<dwSize;dwi++)
{
    char szFile[32];
    HKL hKLTemp=*(lphkl+dwi);
    ImmGetIMEFileName(hKLTemp,szFile,sizeof(szFile));//获得输入法的ime文件
    if(ImmIsIME(*(lphkl+dwi))==1)//是中文输入法
    {
        int RCount=ImmGetDescription(*(lphkl+dwi),(LPTSTR)(LPCTSTR)Buff,255);//取得所有输入法
    }
}
GlobalFree((HANDLE)lphkl);
==========================================================================================
开发输入法程序
输入法程序(IME)其实就是一种动态链接库(DLL),在动态链接库中导出下列函数:
BOOL WINAPI ImeInquire(LPIMEINFO lpIMEInfo,LPTSTR lpszUIClass,LPCTSTR lpszOption)return TRUE
BOOL WINAPI ImeConfigure(HKL hKL,HWND hWnd, DWORD dwMode, LPVOID lpData)return TRUE
DWORD WINAPI ImeConversionList(HIMC hIMC,LPCTSTR lpSource,LPCANDIDATELIST lpCandList,DWORD dwBufLen,UINT uFlag)return 0
BOOL WINAPI ImeDestroy(UINT uForce)return TRUE
LRESULT WINAPI ImeEscape(HIMC hIMC,UINT uSubFunc,LPVOID lpData)return TRUE
BOOL WINAPI ImeProcessKey(HIMC hIMC,UINT vKey,LPARAM lKeyData,CONST LPBYTE lpbKeyState)return TRUE
BOOL WINAPI ImeSelect(HIMC hIMC, BOOL fSelect)return TRUE
BOOL WINAPI ImeSetActiveContext(HIMC hIMC,BOOL fFlag)return TRUE
UINT WINAPI ImeToAsciiEx (UINT uVKey,UINT uScanCode,CONST LPBYTE lpbKeyState,LPDWORD lpdwTransKey,UINT fuState,HIMC hIMC)return r
BOOL WINAPI NotifyIME(HIMC hIMC,DWORD dwAction,DWORD dwIndex,DWORD dwValue)return TRUE
BOOL WINAPI ImeRegisterWord(LPCTSTR lpRead, DWORD dw, LPCTSTR lpStr)return TRUE
BOOL WINAPI ImeUnregisterWord(LPCTSTR lpRead, DWORD dw, LPCTSTR lpStr)return TRUE
UINT WINAPI ImeGetRegisterWordStyle(UINT nItem, LPSTYLEBUF lp)return 0
UINT WINAPI ImeEnumRegisterWord(REGISTERWORDENUMPROC lpfn, LPCTSTR lpRead, DWORD dw, LPCTSTR lpStr, LPVOID lpData)return 0
BOOL WINAPI ImeSetCompositionString(HIMC hIMC, DWORD dwIndex, LPCVOID lpComp, DWORD dwComp, LPCVOID lpRead, DWORD dwRead)return FALSE
LRESULT WINAPI UIWndProc(HWND,UINT,WPARAM,LPARAM)return 0
示例D:/My Documents/Visual Studio Projects/freepy
==========================================================================================
.DEF文件为 链接器-输入-模块定义文件
.lib 链接器-高级-导入库
.tlb MIDL-输出-类型库
==========================================================================================
字体窗体
CClientDC dc(this);
HDC hDC;
CFont mFont;    
hDC = ::GetDC(this->m_hWnd);    
//创建字体
VERIFY(mFont.CreateFont(
    200, 50, 0, 0, FW_HEAVY, TRUE, FALSE, 
    0, ANSI_CHARSET, OUT_DEFAULT_PRECIS,        
    CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY,             
    DEFAULT_PITCH | FF_SWISS, "宋体"));                  
if (hDC!=NULL)
{
    //开始记录窗体轮廓路径
    dc.BeginPath();        
    //设置背景为透明模式,这句话是必须有的。
    dc.SetBkMode(TRANSPARENT);        
    CFont * pOldFont;
    pOldFont = dc.SelectObject( &mFont );
    dc.TextOut(0, 0, "VCKbase");    
    dc.SelectObject( pOldFont );
    mFont.DeleteObject();
    //结束记录窗体轮廓路径
    dc.EndPath();
    //把所记录的路径转化为窗体轮廓句柄
    HRGN m_wndRgn = ::PathToRegion(dc);
    //赋予窗体指定的轮廓形状
    this->SetWindowRgn(m_wndRgn, TRUE);        
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值