如何在onkeypress(或者其他键盘事件)事件中得到中文输入? ( 积分: 200 )

  • 主题发起人 主题发起人 FreeAndNil
  • 开始时间 开始时间
F

FreeAndNil

Unregistered / Unconfirmed
GUEST, unregistred user!
要做个模拟输入的东东,不用tedit,直接创建光标,接受键盘事件,输出到界面显示,现在的问题是,如果输入中文,onkeypress不能获得输入的内容,其他事件好像也不行,该怎么做?

另外还有个小问题,tedit在输入中文时,输入法的提示框会出现在tedit光标下方,而模拟的输入区,输入法的提示框不会出现在光标下方,而是在form的下方,这个该怎么处理?
 
中文输入不发生onkeypress事件。
 
但是中文输入完成后,也会触发onkeypress事件,不过key没法用。

onkeydown里的key值怎么用?
 
汉字是双字节,并不与键盘上的某个键对应。汉字输入法接管了键盘管理,等用户结束输入时,一次性将用户录键入的码发送给应用程序。因此在输入汉字的过程中不会会触发onkeypress事件。要想处理,只能关闭汉字系统,自己处理汉字。
 
“一次性将用户录键入的码发送给应用程序”这样也行啊,怎么获得这些一次性发过来的数据呢?
 
WM_IME_***

程序会收到这类消息
 
如果是处理输入法的话要处理输入法消息,给你写个例子.
例如,我要一个Form,在输入法输入结束后Caption就显示输入法输入的字符串
(注意,本例子焦点控件要是你的Form而不是Form上的其他控件)
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;

type
TForm1 = class(TForm)
private
procedure WMIMECOMPOSITION(var Message: TMessage); message WM_IME_COMPOSITION;
public

end;

var
Form1: TForm1;

implementation
uses
imm;

{$R *.dfm}

procedure TForm1.WMIMECOMPOSITION(var Message: TMessage);
var
himc :Cardinal;
dwSize : DWORD;
Buf : String;
begin
if (Message.LParam and GCS_RESULTSTR) = GCS_RESULTSTR then //如果是输入结果
begin
himc := ImmGetContext(getactivewindow());
dwSize := ImmGetCompositionString(himc, GCS_RESULTSTR, nil, 0);
SetLength(Buf, dwSize);
ImmGetCompositionString(himc, gcs_resultstr, PChar(buf), dwsize);
ImmReleaseContext(GetActiveWindow, himc);
Caption := Buf;
end;
Inherited;
end;

end.
 
中文输入会连续触发onkeypress事件,记录key值,再合成汉字即可,简单写个例子,焦点在form上,输入的中文显示在caption:

procedure TForm1.FormKeyPress(Sender: TObject; var Key: Char);
const
{$J+}
w: string = '';
f: boolean = true;
c1: char = #0;
c2: char = #0;
{$J-}
var
a: array[0..1] of char;
begin
if ord(Key) < 128 then
begin
f := true;
caption := key;
end
else begin
if f then
c1 := key
else
c2 := key;
f := not f;
if f then
begin
a[0] := c1;
a[1] := c2;
w := w + string(a);
caption := w;
end;
end;
end;
 
至于第二个问题嘛,不知道。

我记得当年foxmail3.0发布时,张小龙对记者说,foxmail3的邮件编写控件是他写了2万行代码全重写的控件,我注意到也有这个问题,就是输入法框不会跟随光标移动,而是始终停留在form下方,看来也是没有得到输入法系统的认可,这个问题不知道谁了解。
 
谁知道输入法框光标跟随的问题啊?没头绪
 
后退
顶部