分类: 傻话连篇 |
后来小弟又想在程序中用ctrl键切换ime的显式与关闭(PC机),于是先修改了hzinput.c的1318行的imeIsSpecialKey函数,将ctrl键消息不作处理直接传给宿主面板,如下:
static inline BOOL (int scancode)
{
if (scancode == SCANCODE_TAB
|| scancode == SCANCODE_ENTER
|| scancode > SCANCODE_F1
|| scancode == SCANCODE_LEFTCONTROL) //2006.3.22.Added by wuxian
return TRUE;
}
然后,将GBIMEWinProc函数1534行对ctrl键的处理屏蔽掉,同时将1534行对SHIFT+CTRL键的处理屏蔽:
// if (wParam == SCANCODE_LEFTCONTROL && clean_left_ctrl ) {
// toggle_input_method ();
// InvalidateRect (hWnd, NULL, TRUE);
//}
最后在宿主面板的回调中对ctrl键进行处理,如下:
case SCANCODE_LEFTCONTROL: //left ctrl down, to enable/disable ime panel.
ctrl_times ++;
switch(ctrl_times%2)
{
case 0: //启动ime
if(ctrl_times != 0)
{
ime = GBIMEWindow(hDlg);
ShowWindow(ime, SW_SHOWNORMAL);
}
break;
case 1:
UnregisterIMEWindow(ime);
DestroyMainWindow (ime);
break;
}
break;
到这里,ctrl键的确可以显示/关闭ime面板了。
但,被ctrl键重新启动的ime面板并不能接收asci码的按键消息,也就是说,汉字输入并没有起作用,必须要我用鼠标点击一下宿主面板或者按一下tab键后,才能输入汉字.
然后我就想了个傻办法, 将上面启动ime的部分改成了这个样子,才真正完全正常了:
case 0:
if(ctrl_times != 0)
{
HWND focus;
ime = GBIMEWindow(hDlg);
ShowWindow(ime, SW_SHOWNORMAL);
focus = GetFocusChild(hDlg);
SendMessage(hDlg, MSG_KEYDOWN, SCANC ODE_TAB, 0);
SetFocusChild(focus);
tab_times --;
}
。。。各位路过的大牛给说说,有必要这么麻烦吗??我有点傻,实在想不到其他办法了。为什么要用鼠标点击一下宿主面板或者按一下tab键后,才能输入汉字呢??看样子象是激活宿主面板的动作。。。
在改成上面的代码之前,我还试过SetActiveWindow和SetFocus将宿
主面板或ime面板设为active;SetFocusChild设置宿主面板的某控件焦
点;重绘宿主面板或ime面板;以及其他一些尝试。。。。。
请各位大牛给点破一下我这傻鸟。
另外,输入法在移植的时候应该注意些什么地方?我在论坛上搜索了一下,好象都是些支离破碎的信息,什么“对齐”之类,哪位做过的大牛给系统的点几个地方?在这里先谢过了。
后来又发现了这个MSG_DOESNEEDIME。系统发现当前焦点的控件为可编辑时, 该信号被发给了谁?? 那个谁又是怎样处理该消息滴呢??这方面处理的源码在哪个文件里面??
对此,我们的魏永明哥哥这样说:
这个消息将被发送到获得焦点的窗口,如果需要 IME,就会激活 IME 窗口,否则隐藏 IME 窗口。
。。。可是小乌只是想知道这个机制是在哪个.c里面实现的,走过路过的哥哥们一定要给小弟指点一二。万分感谢~!
联系客服