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

[輸入法]及 [切換輸入法]

 
panda566
一般會員


發表:3
回覆:4
積分:1
註冊:2002-03-25

發送簡訊給我
#1 引用回覆 回覆 發表時間:2002-03-28 08:15:25 IP:211.72.xxx.xxx 未訂閱
各位前輩, 大家好...^_^ 一直以來我都是以<錢達智前輩的-IME95>內的function 來取得local PC安裝的[輸入法]及 [切換輸入法] 但自win 2000 及 win XP 上市後, 我的AP的上述功能便無法使用了.. 煩請各位前輩, 幫個忙如何來排解這個問題...感激不盡...Thank's 以下為該函數內容... //偵測目前作用中的輸入法檔案名稱 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; // -------------------------------------------------- //偵測目前作用中的輸入法檔案名稱 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; // -------------------------------------------------- // 切換到指定的輸入法 function SetActivateIme(sWanted: string): boolean; var iHandleCount: integer; pList: array[1..nHKL_LIST] of HKL; szImeFileName: array[0..MAX_PATH] of char; sImeFileName: string; bInstalled: boolean; i: integer; begin Result := False; sWanted := AnsiUpperCase(sWanted); // 傳入空字串, 切成英數輸入模式 if Length(sWanted) = 0 then begin ToChinese(0, False); Result := True; Exit; end; // 看看是否安裝了這個輸入法 bInstalled := False; iHandleCount := GetKeyboardLayoutList(nHKL_LIST, pList); for i := 1 to iHandleCount do begin ImmGetIMEFileName(pList[I], szImeFileName, MAX_PATH); sImeFileName := AnsiUpperCase(StrPas(szImeFileName)); if sImeFileName = sWanted then begin bInstalled := True; Break; end; end; // 如果這個輸入法已安裝了, 讓那個輸入法的鍵盤分佈(KeyLayout)作用 if bInstalled then begin ActivateKeyboardLayout(pList[i], 0); Result := True; end; end; { of SetActivateIme }
lee
站長


發表:55
回覆:173
積分:45
註冊:2002-02-27

發送簡訊給我
#2 引用回覆 回覆 發表時間:2002-04-02 08:15:25 IP:61.219.xxx.xxx 未訂閱
win2000的"注音"輸入法名稱有改,好像是"中文 (繁體) - 注音", 是不是這原因?    ~~~Delphi K.Top討論區網站管理員~
------
~~~Delphi K.Top網站總管~~~
panda566
一般會員


發表:3
回覆:4
積分:1
註冊:2002-03-25

發送簡訊給我
#3 引用回覆 回覆 發表時間:2002-04-03 10:08:22 IP:211.72.xxx.xxx 未訂閱
沒錯, 就像Lee說的.. Windows 2000 & Windows XP的輸入法名稱改名稱了, 這就是我post source code的原因(也是痛苦的來源)...>_< 看看能不能, 修改上述的source 或其他的方法 取得Windows 2000 & Windows XP輸入法名稱.. 謝謝,所有參與討論的大大家...panda ^_^
lee
站長


發表:55
回覆:173
積分:45
註冊:2002-02-27

發送簡訊給我
#4 引用回覆 回覆 發表時間:2002-04-03 17:49:30 IP:61.219.xxx.xxx 未訂閱
試試我改好的!
unit Unit1;    interface    uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls,imm;    type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
const
  nHKL_LIST = 20;    var
  Form1: TForm1;    implementation    {$R *.DFM}    // --------------------------------------------------
//偵測目前作用中的輸入法檔案名稱
function GetImeFileName: string;
var szImeFileName: array[0..MAX_PATH] of char;
begin
  if ImmGetDescription(GetKeyboardLayout(0), szImeFileName, MAX_PATH) <> 0 then
     Result := AnsiUpperCase(StrPas(szImeFileName))
  else
   Result := '';
end;    procedure ToChinese(hWindows: THandle; bChinese: boolean);
begin
  if ImmIsIME(GetKeyboardLayOut(0)) <> bChinese then
    ImmSimulateHotKey(hWindows, IME_THotKey_IME_NonIME_Toggle);
end;
// 查出指定輸入法的 Keyboard Layout
function GetWantedKL(const sWantedIMEName: string): HKL;
var
  iHandleCount: integer;
  pList: array[1..nHKL_LIST] of HKL;
  szImeName: array[0..254] of char;
  i: integer;
  sTarget: string;
begin
  Result := 0;
  sTarget := Copy(sWantedIMEName, 1, 4);
  if Length(sTarget) <= 0 then Exit;
  // 取得目前系統已安裝輸入法之各個鍵盤配置(Keyboard Layout)
  iHandleCount := GetKeyboardLayoutList(nHKL_LIST, pList);
  for i := 1 to iHandleCount do
  begin
    if ImmEscape(pList[i], 0, IME_ESC_IME_NAME, @szImeName) > 0 then
    begin
      if Copy(StrPas(szImeName), 1, 4) = sTarget then
      begin
        Result := pList[i];
        Exit;
      end;
    end;
  end;
end;    // --------------------------------------------------
// 切換到指定的輸入法
function SetActivateIme(sWanted: string): boolean;
var iHandleCount: integer;
  pList: array[1..nHKL_LIST] of HKL;
  szImeFileName: array[0..MAX_PATH] of char;
  sImeFileName: string;
  bInstalled: boolean;
  i: integer;
begin
  Result := False;
  sWanted := AnsiUpperCase(sWanted);
  // 傳入空字串, 切成英數輸入模式
  if Length(sWanted) = 0 then
  begin
    ToChinese(0, False);
    Result := True;
    Exit;
  end;
  // 看看是否安裝了這個輸入法
  bInstalled := False;
  iHandleCount := GetKeyboardLayoutList(nHKL_LIST, pList);
  for i := 1 to iHandleCount do
  begin
    ImmGetDescription(pList[I], szImeFileName, MAX_PATH);
    sImeFileName := AnsiUpperCase(StrPas(szImeFileName));
    if pos(sWanted,sImeFileName)>0  then
    begin
      bInstalled := True;
      Break;
    end;
  end;
  // 如果這個輸入法已安裝了, 讓那個輸入法的鍵盤分佈(KeyLayout)作用
  if bInstalled then
  begin
    ActivateKeyboardLayout(pList[i], 0);
    Result := True;
   end;
end; { of SetActivateIme }    procedure TForm1.Button1Click(Sender: TObject);
begin
  SetActivateIme('注音');
end;    procedure TForm1.Button2Click(Sender: TObject);
begin
  SetActivateIme('倉頡');
end;    end.    
~~~Delphi K.Top網站總管~~~
------
~~~Delphi K.Top網站總管~~~
P.D.
版主


發表:603
回覆:4038
積分:3874
註冊:2006-10-31

發送簡訊給我
#5 引用回覆 回覆 發表時間:2002-07-17 22:21:49 IP:210.85.xxx.xxx 未訂閱
引言: 試試我改好的! unit Unit1; interface SetActivateIme('倉頡'); end; end.
Dear lee! 我試用了你的方式, 可以將中文輸入呼叫出來, 可是如果我設定 setActivateIme('') 卻無法切回英文模式, 是那裡還有問題嗎? (程式碼均一樣). 我在 win98下操作 發表人 - P.D. 於 2002/07/17 22:22:29
ubong
一般會員


發表:2
回覆:42
積分:23
註冊:2002-10-02

發送簡訊給我
#6 引用回覆 回覆 發表時間:2002-10-02 22:35:40 IP:61.216.xxx.xxx 未訂閱
各位大大:我是BCB的用者,先前為這問題在"深度論壇"貼了個Topic 好久都沒人回應,昨天在本站的WIN32 Api討論區看到這個解答,很高興 將其改為BCB的語法,卻不能用。這個問題,我覺得Borland真的多此一舉, 我覺得像Ms Access 只要設為接受中文輸入法,就會切換為前次使用的輸入法 但Borland的產品就要設定ImeMode and ImeName。我的因應之道是用一ComboBox預先載入一些常用的輸入法再在FormCreat中各別指定(例如: Edit1->ImeName=ComboBox1->Text)這也還可行,但在Win2000其Edit1->ImeName ="注音"就不通。其語法好像是"中文[繁體]-注音". 各位用Delphi 這個解答應該是較上面各位所用的要單純得多了: TScreen *screen;// BCB useage ComboBox1.Items.Assign(screen.Imes); //In Delphi 上一行是網站上的解答,用一個ComboBox來供使用者選擇輸入法,並將其指定給 各個用到中文輸入法的元件,應是不錯的辦法? ubong
------
ubong
ubong
一般會員


發表:2
回覆:42
積分:23
註冊:2002-10-02

發送簡訊給我
#7 引用回覆 回覆 發表時間:2002-10-04 23:41:43 IP:61.225.xxx.xxx 未訂閱
TScreen *screen;// BCB useage ComboBox1.Items.Assign(screen.Imes); //In Delphi 上一行是網站上的解答,用一個ComboBox來供使用者選擇輸入法,並將其指定給 各個用到中文輸入法的元件,應是不錯的辦法? >>經網友的指正,上面的TScreen *screen 是不必要的 ComboBox1.Items.Assign(screen.Imes); 這樣真的可行,應該可避免Win98 and Win2000中文輸入法名稱不一致的問題。 ubong
------
ubong
sanmzhou
一般會員


發表:0
回覆:1
積分:0
註冊:2002-10-17

發送簡訊給我
#8 引用回覆 回覆 發表時間:2002-10-17 15:18:21 IP:210.21.xxx.xxx 未訂閱
岆挼ㄐ苤萊蚚賸 Lee 腔埭鎢珩岆祥夔ピ隙荎恅怀⻌楊ㄐワ堆疆ㄐ郅郅ㄐ
系統時間:2024-04-24 23:48:01
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!