最近客户提出一个需求,希望在我们的程序运行过程中,输入法的状态,不会随着MessageBox或子窗口的弹出而改变.另外还要求所有窗口的输入法状态一致.
这两天查了些资料,知道这得用到一些相关的API去处理做某些事情.可现在小弟的问题是:当输入焦点在某个文本框里时,窗体的DefWndProc函数为什么不能捕捉到对应的"WM_IME_NOTIFY","WM_IME_CONTROL"之类的消息,而只有在类似于弹出Messagebox之后,窗体被激活的情况下才拦截到了一个"WM_IME_SETCONTEXT"和"WM_IME_NOTIFY"消息?是不是这些和输入法有关的的消息被当前获得输入焦点的文本框捕捉并进行了处理的了,所以窗体接收不到?
如果是这样的话,那么我应该怎样做,才能在某个地方拦截所有有关输入法的消息,并对它进行处理呢???

解决方案 »

  1.   

    补充一句,客户是日文系统,用的是日文输入法.
    之所以要补充这一点,那是因为我个人怀疑日文输入法是否和我们中文输入法的某些编码上不一致.
    因为刚刚小弟做了一个试验.用IMessageFilter捕捉到了每一个"WM_IME_NOTIFY"消息,并且在中文输入法下,wParam参数值完全像按照微软定义的一样,从0x0001到0x000D,表达了某一特定的意思.可是我在切换到日文输入法下的时候,在我进行输入的时候,wParam参数居然不是那个范围之内.我看了两个,居然是269和270.我晕倒~~~,这是什么意思啊~~~
    另外,还请各位大虾告诉我为什么我只能捕捉到"WM_IME_SETCONTEXT"和"WM_IME_NOTIFY"这两个消息,其他的消息为什么我捕捉不到???
    另外从微软的MSDN上查得ImmIsUIMessage函数好像是判断一个消息是否是输入法编辑器发送出来的(不知道我理解得对不对,E文水平有限),可是我怎么用它都没效果.
    还有,谁能对ImmIsUIMessage这个API的函数进行详细的解答?因为我可能需要在项目中用到它.