IME の取得や 操作あれこれ
uses Imm;
function TForm1.IsImeOpened(const winctr: TWinControl): boolean;
var Imc:HIMC;
begin
winctr.SetFocus;
Imc := ImmGetContext(winctr.Handle);
result:= ImmGetOpenStatus(imc);
ImmReleaseContext(winctr.Handle, Imc);
end;
//IME オンオフ判定
procedure TForm1.IsIMEButtonClick(Sender: TObject);
begin
if IsImeOpened(RIchEdit1) then
Edit4.Text := 'ON'
else
Edit4.Text := 'OFF';
end;
///////////////////////////////////////
//IMEのモード番号を取得する
function GetInputCharMode(const winctr :TWinControl):DWORD;
var Imc:HIMC;
dwConversion : DWORD;
dwSentence : DWORD;
begin
winctr.SetFocus;
Imc := ImmGetContext(winctr.Handle);
ImmGetConversionStatus(Imc,dwConversion,dwSentence);
Result:= dwConversion;
ImmReleaseContext(winctr.Handle, Imc);
end;
procedure TForm1.IME_ModeButton1Click(Sender: TObject);
begin
Edit3.Text := IntToStr(GetInputCharMode(RichEdit1));
end;
//WindowsXP SP1
//IME日本語入力 Microsoft Natural Input 2002 ver. 8.1
//25 Hiragana
//27 Zen katakana
//24 Zen Eisu
//19 Han Katakana
//16 Han Eisu
//IME韓国語入力 Korean Input System(IME 2002) XPに付属しているもの
//0 straight
//1 Hangul
///////////////////////////////////////
//IME on off セット
procedure ImeOnOff(const winctr :TWinControl; const status:boolean);
var Imc:HIMC;
begin
winctr.SetFocus;
Imc := ImmGetContext(winctr.Handle);
if status then
ImmSetOpenStatus(imc,true)
else
ImmSetOpenStatus(imc,false);
ImmReleaseContext(winctr.Handle, Imc);
end;
procedure TForm1.IMEonButtonClick(Sender: TObject);
begin
ImeOnOff(RichEdit1,True);
end;
procedure TForm1.ImeOffButtonClick(Sender: TObject);
begin
ImeOnOff(RichEdit1,False);
end;
//ひらがな入力などをセットする
procedure SetInputCharMode(const winctr :TWinControl; ImeCharMode:DWORD);
var
Imc : HIMC;
dwConversion : DWORD;
dwSentence : DWORD;
begin
winctr.SetFocus;
Imc := ImmGetContext(winctr.Handle);
ImmGetConversionStatus(Imc,dwConversion,dwSentence);
ImmSetConversionStatus(Imc,ImeCharMode,dwSentence);
ImmReleaseContext(winctr.Handle, Imc);
end;
//IME ひらがな
procedure TForm1.ImeHiraButtonClick(Sender: TObject);
begin
ImeOnOff(RichEdit1,True);
SetInputCharMode(RichEdit1,25);
end;
//IME 英数
procedure TForm1.ImeEisuButtonClick(Sender: TObject);
begin
ImeOnOff(RichEdit1,True);
SetInputCharMode(RichEdit1,16);
end;
///////////////////////////////////////
//キーボードレイアウトが日本語かどうか
function GetLanguage:String;
var
p:array[0..100] of char;
begin
GetKeyboardlayoutname(p);
if StrPas(p) = 'E0010411' then
Result := 'Japanese'
else
Result := 'Other';
end;
//同じくキーボードレイアウトが日本語かどうか
function KeylayoutJapanese:Boolean;
var
p:array[0..100] of char;
begin
GetKeyboardlayoutname(p);
if StrPas(p) = 'E0010411' then
Result := True
else
Result := False;
end;
//WIndowsXPは「E0010411」Windows98SEでは「e0030411」なので
//下4桁の判定がベストだろう(05/11/19)
function KeylayoutJapanese:Boolean;
var
p:array[0..100] of char;
s : String;
i : Integer;
begin
GetKeyboardlayoutname(p);
s := StrPas(p);
i := Length(s);
s := Copy(s, (i-3), 4);
if s = '0411' then
Result := True
else
Result := False;
end;
procedure TForm1.GetKeyBoardLayoutButtonClick(Sender: TObject);
begin
Edit5.Text := GetLanguage;
end;
procedure TForm1.KeyJapanButtonClick(Sender: TObject);
begin
if KeylayoutJapanese then
Edit5.Text := 'Japanese On'
else
Edit5.Text := 'Other';
end;
|