做一个多窗口程序,如何让输入法选择了以后就一直都有。
我以前没在意,但我发现QQ里一旦打开一个输入法后不管调哪个窗口或程序都会有的。所以我想问一下大家。

解决方案 »

  1.   

    看看这些代码就该明白怎么做了
    前两天刚刚看来得
    作者忘记了,不好意思:)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.