截取中文输入法输入的字符串,更改编码为ANSI

本文介绍了一种在全英文版Windows XP系统中,针对非Unicode程序中中文输入显示为“??”的问题解决方案。通过截获WM_IME_COMPOSITION消息并利用ImmGetCompositionStringW及WideCharToMultiByte等函数将Unicode转换为ANSI编码,从而实现正确显示中文。

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

在全英文的XP中,在非unicode的程序中输入的中文会转为“??”。

通过截获WM_IME_COMPOSITION消息得到输入的字符串
ImmGetCompositionStringW得到Unicode
WideCharToMultiByte转换为ANSI


BOOL CchartestDlg::PreTranslateMessage(MSG* pMsg)
{
if (pMsg->message == WM_IME_COMPOSITION)
{
HIMC hIMC;
HWND hWnd=pMsg->hwnd;
DWORD dwSize;
WCHAR lpWideStr[20];

hIMC = ImmGetContext(hWnd);

dwSize = ImmGetCompositionStringW(hIMC, GCS_RESULTSTR, NULL, 0);

dwSize += sizeof(WCHAR);

memset(lpWideStr, 0, 20);

//get string in Unicode
ImmGetCompositionStringW(hIMC, GCS_RESULTSTR, lpWideStr, dwSize);

//transfer to ANSI code
int iSize;
LPSTR pszMultiByte;
int ChineseSimpleAcp = 936;

iSize = WideCharToMultiByte(ChineseSimpleAcp,0,lpWideStr,-1,NULL,0, NULL,NULL);

pszMultiByte = new char[iSize+1]/**sizeof(char)*/;

WideCharToMultiByte(ChineseSimpleAcp, 0, lpWideStr, -1, pszMultiByte, iSize, NULL, NULL );

CString strText = pszMultiByte;

delete pszMultiByte;

ImmReleaseContext(hWnd, hIMC);

return TRUE;
}

return Default();
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值