获得当前输入法的名称: function GetImeFileName: string; var szImeFileName: array[0..MAX_PATH] of char; begin if ImmGetIMEFileName(GetKeyboardLayout(0), szImeFileName, MAX_PATH) <> 0 then Result := AnsiUpperCase(StrPas(szImeFileName)) else Result := ''; end;但在NT下不能用
98下已通过测试,你可以安装各种输入法试试窗口中只要放一个Edit1, 一个Memo1就可以试了,在Edit1中先选择一个输入法,然后输入,只要有字符输入就会记忆,然后把焦点转到Memo1,切换输入法后再进入Edit1,可以看到在Edit1中又变回记忆的输入。怎么样,可以吧,哈哈。unit Unit1;interfaceuses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;type TForm1 = class(TForm) Button1: TButton; Edit1: TEdit; Memo1: TMemo; procedure Edit1Change(Sender: TObject); procedure Edit1Enter(Sender: TObject); private { Private declarations } public { Public declarations } end;var Form1: TForm1;implementation{$R *.DFM}Uses registry, imm; var CurIme: string;function GetImeCurName: String; var r: TRegistry; line : TStrings; i: Integer; S: String; function GetImeFileName: string; var szImeFileName: array[0..MAX_PATH] of char; begin if ImmGetIMEFileName(GetKeyboardLayout(0), szImeFileName, MAX_PATH) <> 0 then Result := AnsiUpperCase(StrPas(szImeFileName)) else Result := ''; end; begin Line:=TStringList.Create; r:=TRegistry.Create; S:=GetImeFileName; r.RootKey:=HKEY_LOCAL_MACHINE; r.OpenKey('System',False); r.OpenKey('CurrentControlSet',False); r.OpenKey('Control',False); r.OpenKey('Keyboard Layouts',False); r.GetKeyNames(Line); For i:=0 to Line.Count-1 do begin if Pos('E',Line[i])>0 then begin r.CloseKey; r.RootKey :=HKEY_LOCAL_MACHINE; r.OpenKey('System',False); r.OpenKey('CurrentControlSet',False); r.OpenKey('Control',False); r.OpenKey('Keyboard Layouts',False); r.OpenKey(Line[i],False); if r.ReadString('IME file')=S then begin Result:=r.ReadString('Layout Text'); Break; end; end; end; r.Free; Line.Free; end;procedure SetCurIme(ImeName:string); var I: Integer; HandleToSet: HKL; begin if not SysLocale.FarEast then Exit; if ImeName <> '' then begin if (AnsiCompareText(ImeName, Screen.DefaultIme) <> 0) and (Screen.Imes.Count <> 0) then begin HandleToSet := Screen.DefaultKbLayout; I := Screen.Imes.IndexOf(ImeName); if I >= 0 then HandleToSet := HKL(Screen.Imes.Objects[I]); ActivateKeyboardLayout(HandleToSet, KLF_ACTIVATE); end; end; end;procedure TForm1.Edit1Change(Sender: TObject); begin CurIme:=GetImeCurName; end;procedure TForm1.Edit1Enter(Sender: TObject); begin SetCurIme(CurIme); end;end.
宠辱不惊,看庭前花开花落,去留无意;毁誉由人,望天上云卷云舒,聚散任风。
—————————————————————————————————
function GetImeFileName: string;
var
szImeFileName: array[0..MAX_PATH] of char;
begin
if ImmGetIMEFileName(GetKeyboardLayout(0), szImeFileName, MAX_PATH) <> 0 then
Result := AnsiUpperCase(StrPas(szImeFileName))
else
Result := '';
end;但在NT下不能用
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;type
TForm1 = class(TForm)
Button1: TButton;
Edit1: TEdit;
Memo1: TMemo;
procedure Edit1Change(Sender: TObject);
procedure Edit1Enter(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;var
Form1: TForm1;implementation{$R *.DFM}Uses registry, imm;
var CurIme: string;function GetImeCurName: String;
var r: TRegistry;
line : TStrings;
i: Integer;
S: String; function GetImeFileName: string;
var
szImeFileName: array[0..MAX_PATH] of char;
begin
if ImmGetIMEFileName(GetKeyboardLayout(0), szImeFileName, MAX_PATH) <> 0 then
Result := AnsiUpperCase(StrPas(szImeFileName))
else
Result := '';
end;
begin
Line:=TStringList.Create;
r:=TRegistry.Create;
S:=GetImeFileName;
r.RootKey:=HKEY_LOCAL_MACHINE;
r.OpenKey('System',False);
r.OpenKey('CurrentControlSet',False);
r.OpenKey('Control',False);
r.OpenKey('Keyboard Layouts',False);
r.GetKeyNames(Line);
For i:=0 to Line.Count-1 do
begin
if Pos('E',Line[i])>0 then
begin
r.CloseKey;
r.RootKey :=HKEY_LOCAL_MACHINE;
r.OpenKey('System',False);
r.OpenKey('CurrentControlSet',False);
r.OpenKey('Control',False);
r.OpenKey('Keyboard Layouts',False);
r.OpenKey(Line[i],False);
if r.ReadString('IME file')=S then
begin
Result:=r.ReadString('Layout Text');
Break;
end;
end;
end;
r.Free;
Line.Free;
end;procedure SetCurIme(ImeName:string);
var I: Integer;
HandleToSet: HKL;
begin
if not SysLocale.FarEast then Exit;
if ImeName <> '' then
begin
if (AnsiCompareText(ImeName, Screen.DefaultIme) <> 0)
and (Screen.Imes.Count <> 0) then
begin
HandleToSet := Screen.DefaultKbLayout;
I := Screen.Imes.IndexOf(ImeName);
if I >= 0 then
HandleToSet := HKL(Screen.Imes.Objects[I]);
ActivateKeyboardLayout(HandleToSet, KLF_ACTIVATE);
end;
end;
end;procedure TForm1.Edit1Change(Sender: TObject);
begin
CurIme:=GetImeCurName;
end;procedure TForm1.Edit1Enter(Sender: TObject);
begin
SetCurIme(CurIme);
end;end.