線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:2409
推到 Plurk!
推到 Facebook!

請問開關輸入法的問題

尚未結案
webber
初階會員


發表:54
回覆:76
積分:26
註冊:2004-04-20

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-12-09 17:01:59 IP:220.130.xxx.xxx 未訂閱
我寫了如下開關輸入法的function,結果執行時,輸入法並不會切換 請問那裡寫錯了呢?    function SetActivateIme( sWanted: string): boolean; var  HandleToSet: HKL; var  i:Integer; begin      Result := False;   i:=Screen.Imes.IndexOf(sWanted);   if i>=0 then begin /////////open ime     HandleToSet:=hkl(screen.Imes.objects[i]);     activatekeyboardlayout(HandleToSet,KLF_ACTIVATE);     result:=true;   end else begin  /////////close ime       HandleToSet := GetKeyboardLayout(0);       if ImmIsIME(HandleToSet) then begin         HandleToSet := LoadKeyboardLayout('00000409', KLF_ACTIVATE);       end;   end; end;    K.Top是我見過最棒的程式社群
如果沒有K.Top真不知道該怎麼活
allenchan
資深會員


發表:10
回覆:306
積分:283
註冊:2004-01-06

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-12-10 01:03:02 IP:61.62.xxx.xxx 未訂閱
我測試的結果是 Ok 的,我測試的方式是放兩個 Button 在 Form 上,Button1 按下去切換成 '中文 (繁體) - 注音',Button2 按下去就關掉。
function SetActivateIme( sWanted: string ): boolean;
var
  HandleToSet : HKL;
  i : Integer;
begin      Result := False;
  i := Screen.Imes.IndexOf(sWanted);
  if i >= 0 then
  begin /////////open ime
    HandleToSet := HKL(Screen.Imes.Objects[i]);
    ActivateKeyboardLayout(HandleToSet, KLF_ACTIVATE);
    Result := true;
  end else
  begin /////////close ime
    HandleToSet := GetKeyboardLayout(0);
    if ImmIsIME(HandleToSet) then
    begin
      HandleToSet := LoadKeyboardLayout('00000409', KLF_ACTIVATE);
    end;
  end;
end;    procedure TForm1.Button1Click(Sender: TObject);
begin
    SetActivateIme('中文 (繁體) - 注音');
end;    procedure TForm1.Button2Click(Sender: TObject);
begin
    SetActivateIme('');
end;
webber
初階會員


發表:54
回覆:76
積分:26
註冊:2004-04-20

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-12-12 00:17:09 IP:220.130.xxx.xxx 未訂閱
參考controls.pas的原始碼後,發現下面才是比較完備的寫法    
function SetActivateIme( FImeName: string;hWnd: HWnd): boolean;
var
  I: Integer;
  HandleToSet: HKL;
  FImeMode:TImeMode;
begin      if FImeName <> '' then begin
    FImeMode:=imOpen;
  end else begin
    FImeMode:=imClose;
  end;      if FImeName <> '' then
  begin
//    if (AnsiCompareText(FImeName, Screen.DefaultIme) <> 0) and (Screen.Imes.Count <> 0) then
    if (Screen.Imes.Count <> 0) then
    begin
      HandleToSet := Screen.DefaultKbLayout;
      if FImeMode <> imDisable then
      begin
        I := Screen.Imes.IndexOf(FImeName);
        if I >= 0 then
          HandleToSet := HKL(Screen.Imes.Objects[I]);
      end;
      ActivateKeyboardLayout(HandleToSet, KLF_ACTIVATE);
    end;
  end;
  SetImeMode(hWnd, FImeMode);
end;
K.Top是我見過最棒的程式社群
如果沒有K.Top真不知道該怎麼活
webber
初階會員


發表:54
回覆:76
積分:26
註冊:2004-04-20

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-12-12 00:17:34 IP:220.130.xxx.xxx 未訂閱
sorry 不小心重貼了 發表人 - webber 於 2004/12/12 00:19:01
系統時間:2017-12-12 20:21:05
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!