環境はXPのダウングレード,D7です。
XPでImmGetConversionListによりカナを取得していたのですが
ダウングレードでも取得できません。
ビスタ環境の方はどうしているのでしょうか?
ご教授下さい。
「サードパーティのIMEをインストールしない限り,Windows VistaではTSFが使われる」 ので、ATOKとかのIMEを入れるのはどう?
でなければ、IME関連のAPIをやめて、TSFに移行しないと。
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.
そうねさん、New Monkeyさん有難うございます。
私にはAPIとかは別世界の話のようで、どなたかのレスを
コピーして使っていたのですが…
New Monkeyさん、今は環境がそろってないので後ほど
試してみます。有難うございました。
New Monkeyさん、見事に取得できました。我がままついでに
カタカナの変換はできますか?
CMODEとかに'KATAKANA'とかあったので、方法があるのかと
自分なりには見てみたのですが
私には見当もつきません。(アホです)
お手数ですが、よろしくお願いします。
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;
うーん、間違ってるかもしれないです
New Monkeyさん、何度もすみません。
OKでした。完璧です。なんの問題もなかったです。
本当に感謝です。有難うございました。
ツイート | ![]() |