【问题标题】:How to use windows IME in delphi?如何在delphi中使用windows输入法?
【发布时间】:2011-03-07 14:35:32
【问题描述】:

我有几个键盘,它们输入不同的 TMemo。在英语中,一切正常,但在韩语中,击键会先发送到 IME,然后再发送到我的 onKeypress(它处理/识别不同的键盘),所以在此之前我无法准确判断它来自哪个键盘。

我并不完全知道如何使用 WinApi,但我需要学习使用处理 IME 的部分。有很多资料HERE,但我需要知道如何在delphi中应用。我需要存储每个用户的击键并将它们发送到 IME。

也许有人可以帮助我学习使用IMM.PAS

【问题讨论】:

  • 你想完成什么任务?
  • (可能)存储我的击键并将它们发送到 IME。或者任何可以使来自不同键盘的击键不会相互干扰的方法。
  • 尝试在一台计算机上使用两个物理键盘,或者尝试在您的应用程序中支持语言切换?
  • 试图将我收到的输入与 IME 分开。

标签: windows delphi winapi internationalization ime


【解决方案1】:

让它工作。使用 ImmGetContext、ImmSetCompositon、ImmGetComposition 和 NormalizeString。

procedure TForm1.IMEFUNCTION(var msg: TMsg);
var
  buf: array [0..20] of char;
  hHimc: HIMC;
  i, j: integer;
  str: string;
  temporary: PWideChar;
begin

   hHimc:= ImmGetContext (msg.hwnd);
   if hHimc = 0 then
    Exit;
   fillchar (buf, 20, 0);
   ImmSetCompositionStringW (hHimc, SCS_SETSTR, PChar (''), Length(''), nil, 0);
   ImmGetCompositionString (hHimc, GCS_COMPSTR, @buf, 20);

  temporary:= PWideChar(Edit1.Text+buf[0]);
  NormalizeString(5 , temporary, -1, buf, 20);
  Edit1.Text:=buf;

    end;//end if
  end;//end for
  ImmReleaseContext (handle, hHimc);

end;

旁注:我并没有真正使用 TEdit,我使用了 StringGrid 和 for 循环。 (但总体思路是有的)

【讨论】:

    【解决方案2】:

    我怀疑 Windows 是否支持你想做的事情,我怀疑你能否让 Windows 以不同的方式工作。听起来您正试图在一台计算机上使用两个物理键盘。

    IMM.PAS 是 Windows IME API 的包装器,似乎并不是为了帮助您完成您想做的事情而编写的。

    你为什么不用两台电脑,两个键盘?

    【讨论】:

    • 这是我公司给我的规范的一部分。我已经成功地分离了从 IME 收到的击键/字符,但现在我无法获得需要多次击键的字符。我想知道我还没有尝试过的其他函数是否可以像使用 RECONVERTSTRING 的函数一样解决这个问题,但是没有太多的 delphi 示例代码可以帮助我弄清楚如何使用这些函数。
    猜你喜欢
    • 2013-05-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多