Как использовать Windows IME в Delphi? - PullRequest
1 голос
/ 24 июня 2010

У меня есть несколько клавиатур, и они вводят разные TMemos. На английском все работает нормально, но на корейском языке нажатия клавиш отправляются в IME до того, как он отправляет его на мой onKeypress (который обрабатывает / идентифицирует различные клавиатуры), поэтому я не могу точно сказать, с какой клавиатуры он пришел до этого. 1001 *

Я точно не знаю, как использовать WinApi, но мне нужно научиться использовать ту часть, которая касается IME. Существует много информации ЗДЕСЬ , но мне нужно знать, как применить ее в Delphi. Мне нужно хранить нажатия клавиш каждого пользователя и отправлять их в IME.

Возможно, кто-то может помочь мне научиться использовать IMM.PAS

Ответы [ 2 ]

3 голосов
/ 28 июня 2010

Получил это на работу. Использование 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. (но общая идея есть)

0 голосов
/ 25 июня 2010

Я сомневаюсь, что Windows поддерживает то, что вы хотите сделать, и я сомневаюсь, что вы можете заставить Windows работать по-другому. Похоже, вы пытаетесь использовать две физические клавиатуры на одном компьютере.

IMM.PAS - это оболочка для Windows IME API, и, похоже, она написана не для того, чтобы помочь вам сделать именно то, что вы хотите.

Почему вы не используете два компьютера с двумя клавиатурами?

...