ImmGetConversionListの代替は?

解決


いち  2009-03-04 20:03:53  No: 33567

環境はXPのダウングレード,D7です。
XPでImmGetConversionListによりカナを取得していたのですが
ダウングレードでも取得できません。
ビスタ環境の方はどうしているのでしょうか?
ご教授下さい。


そうね  2009-03-04 20:30:10  No: 33568

「サードパーティのIMEをインストールしない限り,Windows VistaではTSFが使われる」 ので、ATOKとかのIMEを入れるのはどう?
でなければ、IME関連のAPIをやめて、TSFに移行しないと。


New Monkey  2009-03-05 06:34:23  No: 33569

ImmGetConversionListにこだわりがなく、ただカナを取得できればいいなら、これでできるかもしれないです。ただし手持ちの Windows XP SP3 + Microsoft(R) IME スタンダード 2002 の環境でしかテストしてないので、Vistaでは無理かもしれません。

まず

http://read.pudn.com/downloads90/sourcecode/chinese/344545/Delphi/msime.pas__.htm

をmsime.pasとして保存し、usesのoffice2000を消します。

メインのコードは以下になります。

---------------------------------------------------------------

unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Button1: TButton;
    Edit1: TEdit;
    Edit2: TEdit;
    procedure Button1Click(Sender: TObject);
  private
    { Private 宣言 }
  public
    { Public 宣言 }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
  vGuid: TGUID;
  vFELanguage: IFELanguage;
  bsIn, bsOut: PWideChar;
  W: array [0..1023] of WideChar;
begin
  if CLSIDFromString(PWideChar(WideString('MSIME.Japan')), vGuid) <> S_OK then Exit;
  if CoCreateInstance(vGuid, nil, CLSCTX_SERVER, IFELanguage, vFELanguage) <> S_OK then Exit;
  if vFELanguage.Open <> S_OK then Exit;

  StringToWideChar(Edit1.Text, @W, SizeOf(W));
  bsIn := SysAllocString(@W);
  bsOut := nil;
  if vFELanguage.GetPhonetic(bsIn, 1, -1, @bsOut) <> S_OK then Exit;
  Edit2.Text := WideCharToString(bsOut);

  if Assigned(bsIn) then SysFreeString(bsIn);
  if Assigned(bsOut) then SysFreeString(bsOut);
  vFELanguage.Close;
  vFELanguage := nil;
end;

initialization
  CoInitialize(nil);

finalization
  CoUnInitialize;

end.


いち  2009-03-05 09:11:00  No: 33570

そうねさん、New Monkeyさん有難うございます。
私にはAPIとかは別世界の話のようで、どなたかのレスを
コピーして使っていたのですが…
New Monkeyさん、今は環境がそろってないので後ほど
試してみます。有難うございました。


いち  2009-03-05 22:27:49  No: 33571

New Monkeyさん、見事に取得できました。我がままついでに
カタカナの変換はできますか?
CMODEとかに'KATAKANA'とかあったので、方法があるのかと
自分なりには見てみたのですが
私には見当もつきません。(アホです)
お手数ですが、よろしくお願いします。


New Monkey  2009-03-06 08:47:04  No: 33572

function HiraganaToKatakana(src: String): String;
var
  lcid: HKL;
  dest: array [0..1024] of Char;
  len: Integer;
begin
  ZeroMemory(@dest, SizeOf(dest));
  lcid := GetKeyboardLayout(0) shl 16 shr 16;
  len := LCMapString(lcid, LCMAP_KATAKANA {or LCMAP_HALFWIDTH}, PChar(src), Length(src), @dest, SizeOf(dest));
  Result := dest;
end;

うーん、間違ってるかもしれないです


いち  2009-03-07 18:10:53  No: 33573

New Monkeyさん、何度もすみません。
OKでした。完璧です。なんの問題もなかったです。
本当に感謝です。有難うございました。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加