在某个控件中按键时,可以获取Key值,这是键盘对应的虚拟码。如果输入的是中文,要截获中文怎么办呢?
代码如下:
先添加一个ApplicationEvents1控件和一个Label1,在其OnMessage事件中,添加如下代码:
void __fastcall TForm1::ApplicationEvents1Message(tagMSG &Msg,
bool &Handled)
{
if (Msg.message == WM_IME_COMPOSITION)
{
HIMC hIMC;
HWND hWnd=Msg.hwnd;
DWORD dwSize;
WCHAR lpWideStr[20];
if(Msg.LParam & GCS_RESULTSTR)//判断是否有空格键从输入法中取文字上屏
{
hIMC = ImmGetContext(hWnd);
dwSize = ImmGetCompositionStringW(hIMC, GCS_RESULTSTR, NULL, 0);
dwSize += sizeof(WCHAR);
memset(lpWideStr, 0, 20);
//获取Unicode
ImmGetCompositionStringW(hIMC, GCS_RESULTSTR, lpWideStr, dwSize);
//将Unicode码转成ANSI码,此处可以用C++builder中的WideString类代替
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 );
String strText = pszMultiByte;
//显示到Label1中
Label1->Caption = Label1->Caption + strText;
delete pszMultiByte;
ImmReleaseContext(hWnd, hIMC);
}
return ;
}
Handled = false
}
上述代码,可以向Label1中输入中文,即使Label1具有可编辑值。