没有可用分了,我也不知道怎杨才能够得到可用分,还请帮忙呀。
我想得到keypress中的所有字符,如下:
procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
edit2.text:=key;//-------------(问题是当输入的是汉字时,得到的是乱码,应该怎么解决呢?)
end;end.帮忙呀。
我想得到keypress中的所有字符,如下:
procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
edit2.text:=key;//-------------(问题是当输入的是汉字时,得到的是乱码,应该怎么解决呢?)
end;end.帮忙呀。
一、汉字输入的消息
一个输入法会获得目标窗口的键盘消息,并产生一系统的与输入法有关的消息,通过处理这些消息,便可获得输入和控制输
入法。
但不同的输入法产生的消息有所不同(主要是指那些非标准输入法),不能全按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动作。