正在做一个完全自绘的编辑控件,要能处理中文。但出现了一个问题,我在程序中要响应WM_KEYDOWN消息,其中有处理左右按键来控制光标,但是当用拼音输入法进行中文输入的时候,用左右键选词和用Backspace键消去拼音字母的时候,我的控件也会同时收到相应的按键消息,也就是说,一个按键,同时引发了输入法光标的移动和我自己程序的光标的移动,但这是我不希望发生的。我希望在输入法中的任何操作对我都是透明的,我只响应WM_IME_CHAR来获得它最终的输出结果,如何才能做到?
希望各位不吝赐教,得解后定送高分!
希望各位不吝赐教,得解后定送高分!
嘿嘿 具体怎么判断 还的找找资料
char ilID[15]; //输入法代号。
char szName[100];//输入法的说明文字。
IL* pNext;
}; 3. 加入一个私有的成员变量 IL* m_pILHead; 4. 加入加载输入法列表信息的成员函数//此函数只针对Windows2000以上版本,如要在Windows98版本的代码请与笔者联系。BOOL CInputLanguage::LoadInputLanguage()
{
HKEY hKey,hKey1;
DWORD cp=16;
char lp[15];
CString szID;
CString szKeyName,szKeyName1;
szKeyName = "Keyboard Layout\\Preload";
szKeyName1 = "System\\CurrentControlSet\\Control\\Keyboard Layouts\\"; int i=1;
szID.Format("%d",i); DWORD lpT=REG_SZ;
if(::RegOpenKey(HKEY_CURRENT_USER,szKeyName,&hKey)==ERROR_SUCCESS )
{
While( ::RegQueryValueEx(hKey,szID,NULL,&lpT,(LPBYTE)lp,&cp) == ERROR_SUCCESS )
{
CString szTempName;
szTempName = szKeyName1 + (LPCTSTR)(LPTSTR)lp;
if(RegOpenKey(HKEY_LOCAL_MACHINE,szTempName,&hKey1)==ERROR_SUCCESS )
{
char lpD[100];
DWORD lpS=100; //DataSize
if(RegQueryValueEx(hKey1,"Layout text",NULL,&lpT,(LPBYTE)lpD,&lpS)==ERROR_SUCCESS)
{
IL* p1,*p2;
p1 = m_pILHead;
p2 = new(IL);
strcpy(p2->ilID,lp);
strcpy(p2->szName,lpD);
p2->pNext = NULL;
if( p1 )
{
while( p1->pNext ){ p1 = p1->pNext ; }
p1->pNext = p2;
}
else
{
m_pILHead = p2;
}
}
}
::RegCloseKey(hKey1);
i++;
szID.Format("%d",i);
}
} ::RegCloseKey(hKey);
return (m_pILHead != NULL );} 5. 加入选择输入法成员函数BOOL CInputLanguage::SelectInputLanguage(IL *pIL){
if( !pIL ) return FALSE;
HKL hkl;
hkl=LoadKeyboardLayout(pIL->ilID,KLF_ACTIVATE);//装载输入法
if(hkl==NULL) return FALSE;
else{
ActivateKeyboardLayout(hkl,KLF_SETFORPROCESS);//激活输入法
}
return TRUE;} 6. 其它部分CInputLanguage::CInputLanguage(){
m_pILHead = NULL;
LoadInputLanguage();}CInputLanguage::~CInputLanguage(){
Clear();
}//消除链表内存。void CInputLanguage::Clear(){
IL* p1,*p2;
p1 = m_pILHead; while( p1 )
{
p2 = p1;
p1 = p1->pNext;
delete(p2);
}
m_pILHead = NULL;}//获得输入法信息链表头结点指针。IL* CInputLanguage::GetInputLanguageList(){
return m_pILHead;
} 使用此类时,只要将其头文件包括到要调用的文件中,调用GetInputLanguageList函数可以得到输入法信息链表的头结点指针,通过遍历此链表得到所有已安装的输入法的信息;通过SelectInputLanguage函数可以自由的控制输入法了
你能简单说一下思路吗?我想只需要解决当输入法在操作的时候,WM_KEYDOWN消息自动被屏蔽即可,注意,不仅仅是针对拼音输入法,最好能适用于所有输入法。to 42252343(大跃进的猪):
如果是通过检测输入法是否已经打开的方法,感觉还是会有缺陷,例如:微软拼音输入法3.0 中,SHIFT键可以进行中英切换,在英文状态下,虽然输入法是打开状态,但是这时的方向键控制我还是需要处理的。
1、在OnKeyDown函数中,输入中文的时候,nChar参数都是229,可以用这个特点来区别并处理;
2、在OnKeyDown和OnKeyUp函数中处理中文,以及删除键、反向删除键,在OnChar中处理英文和字符;仅供参考,:)
不过... 这229的依据是什么呀?各种输入法都是这样吗?有什么官方资料可考的么?