在程序中有一编辑框,动态的取得其输入法,并能将该输入法赋与另一编辑框。我不要那种把系统中已安装的输入法全部取出来让用户选择的方法,或是取得默认输入法的方法。要的是能动态的取得输入法,并将该输入法赋与其它编辑框。

解决方案 »

  1.   

    Edit2.ImeName :=  Edit1.ImeName;—————————————————————————————————
    宠辱不惊,看庭前花开花落,去留无意;毁誉由人,望天上云卷云舒,聚散任风。
    —————————————————————————————————
      

  2.   

    是这样的,Edit1中用的中文输入法,Edit2用的英文输入法,因为要在两个编辑框中频繁切换,因此输入法也要频繁切换。因为中文输入法各人有各人的喜好,又不能在程序里写死。因此想找一种能够保存某编辑框上一次的输入法,当再次进入该编辑框时将该编辑框的输入法置为上次离开时的输入法的方法。
      

  3.   

    获得当前输入法的名称:
    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下不能用
      

  4.   

    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.