没有可用分了,我也不知道怎杨才能够得到可用分,还请帮忙呀。
我想得到keypress中的所有字符,如下:
procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
    edit2.text:=key;//-------------(问题是当输入的是汉字时,得到的是乱码,应该怎么解决呢?)
end;end.帮忙呀。

解决方案 »

  1.   

    http://blog.donews.com/zwell/articles/48170.aspx
      

  2.   

    我想知道就是如何翻译得到key表示的汉字而已?有这么麻烦?
      

  3.   

    肯定用KEY不行吧,一个CHAR表达一个汉字不行吧
      

  4.   

    重点是这一段,搞清楚了输入法的消息,用不用hook完全在你---------------------------------------------------------------------------------
    一、汉字输入的消息
      一个输入法会获得目标窗口的键盘消息,并产生一系统的与输入法有关的消息,通过处理这些消息,便可获得输入和控制输
    入法。
      但不同的输入法产生的消息有所不同(主要是指那些非标准输入法),不能全按MSDN中输入法消息(WM_IME_xx)来作处理,
    但这里有些会是相同的,对于我们来说也只需要处理这些。
      当输入法编码完成时,便会向目标窗口发送WM_IME_COMPOSITION(lParam=GCS_RESULTSTR),这样目标窗口收到这个消息
    时便可通过ImmGetCompositionString得到这次的输入(字或词或句子)。如果目标窗口在收到这个消息时调用了默认处理,那么接
    着便会将输入分成n个WM_IME_CHAR发送给目标窗口,当WM_IME_CHAR也调用了默认处理时,便会每个WM_IME_CHAR分成
    两个WM_CHAR消息Post给目标窗口。由此可见,在三个地方可以获得所输入的汉字,当然在第一个消息WM_IME_COMPOSITION
    获取最保险。不过我在测试过程中发现有的输入法(陈桥5.2)居然会发两次WM_IME_COMPOSITION(lParam=GCS_RESULTSTR),
    所以如果要用这个消息获得输入时,你得在获取后调用ImmSetCompositionString将它清空,否则会获得重复数据(比较出名的键盘记
    录者就有这个问题),所以我在实现中是处理WM_IME_CHAR消息。当然你如果在WM_CHAR消息中处理也可以,但你就得负责汉
    字的组合,还要知道有些程序处理WM_IME_CHAR消息而不进行默认处理,便会使得无WM_CHAR消息。
      有些人会发现在应用程序中一个汉字输入只调用一次OnChar,传入的值是汉字的高字节,这岂不跟上面说的两个WM_CHAR消
    息矛盾?呵呵,不矛盾,你可以在OnChar中查查消息队列,确实还有一个WM_CHAR消息,对应的值是汉字的低字节。只不过在第
    一个默认的OnChar处理中,通过::PeekMessage(&msg, m_hWnd, WM_CHAR, WM_CHAR, PM_NOYIELD | PM_REMOVE));直接移走了下一
    个WM_CHAR消息,所以自然下次就没有了。如果你在这不调用基类的OnChar处理,你便会发现两次进入OnChar。
      马上会有人问:“这样?会不会我们在WM_CHAR消息中很难处理?” 放心,不会。在WH_GETMESSAGE钩子中,无论什么队
    列消息都能得到,大家可参考一下MSDN中的说明。我们只需要处理对应消息的PM_REMOVE动作。