全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:3761
推到 Plurk!
推到 Facebook!

如何抓取WINDOWS系統預設的輸入法

尚未結案
chimera
初階會員


發表:62
回覆:78
積分:28
註冊:2003-03-22

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-12-17 16:28:36 IP:61.57.xxx.xxx 未訂閱
因為有些edit是一定輸入中文的,但是並不是每個使用者的預設輸入法都是用注音或是某種特定的輸入法,所以我想知道該如何抓取預設輸入法並且切換成該輸入法
leo2568
中階會員


發表:54
回覆:124
積分:70
註冊:2003-09-21

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-12-17 18:07:21 IP:61.217.xxx.xxx 未訂閱
引言: 因為有些edit是一定輸入中文的,但是並不是每個使用者的預設輸入法都是用注音或是某種特定的輸入法,所以我想知道該如何抓取預設輸入法並且切換成該輸入法
edit1,edit2,,,可個別設定輸入法 ╭╧╮╭╧╮╭╧╮╭╧╮╭╮│║│║│║ ╘∞╛╘∞╛╘∞╛╘∞╛ . ﹒﹒‧∴ ☆..... 發表人 - leo2568 於 2003/12/17 18:14:51
chimera
初階會員


發表:62
回覆:78
積分:28
註冊:2003-03-22

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-12-17 18:08:27 IP:61.57.xxx.xxx 未訂閱
引言: 因為有些edit是一定輸入中文的,但是並不是每個使用者的預設輸入法都是用注音或是某種特定的輸入法,所以我想知道該如何抓取預設輸入法並且切換成該輸入法
看了前面的文章,有GetKeyboardLayoutList這個method可以列舉出所有的輸入法,是可以使用,就把幾個比較常用的輸入法用判斷式決定要用哪個輸入法,但是我還是好奇要要怎麼直接抓"預設的輸入法"
AB
高階會員


發表:166
回覆:262
積分:125
註冊:2003-08-21

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-12-17 18:19:49 IP:61.221.xxx.xxx 未訂閱
如果你看過dllee版主的範例 【BCB】【發表】列出所有輸入法(含語言輸入)、切換輸入法、監視目前輸入法 http://delphi.ktop.com.tw/topic.php?TOPIC_ID=37920 Windows2000下指定輸入法 http://delphi.ktop.com.tw/topic.php?topic_id=18705 ===================================================== 就再去網路查看看 delphi 寬(老師) 的看看或msdn 發表人 - ab 於 2003/12/17 18:21:39
qoo1234
版主


發表:256
回覆:1166
積分:659
註冊:2003-02-24

發送簡訊給我
#5 引用回覆 回覆 發表時間:2003-12-18 21:15:04 IP:218.163.xxx.xxx 未訂閱
unit Unit1;    interface    uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;    type
  TForm1 = class(TForm)
    Edit1: TEdit;
    ComboBox1: TComboBox;
    procedure FormShow(Sender: TObject);
    procedure ComboBox1Change(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;    var
  Form1: TForm1;    implementation    {$R *.dfm}    procedure TForm1.FormShow(Sender: TObject);
begin
 ComboBox1.Items:=Screen.Imes;  //顯示目前中文輸入法種類
end;    procedure TForm1.ComboBox1Change(Sender: TObject);
begin
  Edit1.ImeName:= ComboBox1.Text;  //設定中文輸入法類型
  Edit1.SetFocus;
end;    end.     
網海無涯,學無止境!
P.D.
版主


發表:571
回覆:3880
積分:3666
註冊:2006-10-31

發送簡訊給我
#6 引用回覆 回覆 發表時間:2003-12-19 00:29:18 IP:61.71.xxx.xxx 未訂閱
給你一些我常用的輸入法設定, 你直接引用就可以, 但 TsysUt 是formname, 請 自行修正    
private 
    function  GetIMEList(dCombobox: TComboBox): integer;
    function  GetImeFileName: string; 
    function  SetActiveIme(sWanted: string): boolean;  
    function  SetFirstIme: boolean;
    function  SetCloseIme: boolean;
    function  SetKey2Ime(aObj: TWinControl): boolean;
....
// 取得window內所有的輸入法
function TSysUt.GetIMEList(dCombobox: TComboBox): integer;
         var iHandleCount: integer;
             pList: array[1..nHKL_LIST] of HKL;
             szImeFileName: array[0..MAX_PATH] of char;
             sImeFileName: string;
             i: integer;
begin
     // 看看是否安裝了這個輸入法
     iHandleCount:= GetKeyboardLayoutList(nHKL_LIST, pList);
     for i:= 1 to iHandleCount do begin
         ImmGetDescription(pList[i], szImeFileName, MAX_PATH);
         sImeFileName := trim(AnsiUpperCase(StrPas(szImeFileName)));
         dCombobox.Items.Add(sImeFileName);
     end;
     dCombobox.Items.Strings[0]:= '';
     result:= iHandleCount;
end;    //偵測目前作用中的輸入法檔案名稱
function TSysUT.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;    // 切換到指定的輸入法
function TSysUT.SetActiveIme(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);
     // 看看是否安裝了這個輸入法
     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;    // 切換到第一個輸入法
function TSysUT.SetFirstIme: boolean;
         var iHandleCount: integer;
             pList: array[1..nHKL_LIST] of HKL;
             szImeFileName: array[0..MAX_PATH] of char;
begin
     iHandleCount:= GetKeyboardLayoutList(nHKL_LIST, pList);
     if iHandleCount>=2 then begin
        ImmGetDescription(pList[2], szImeFileName, MAX_PATH);
        ActivateKeyboardLayout(pList[2], 0);
        result:= True;
     end
     else result:= False;
end;    // 回英數輸入法, 本輸入法假設第一組為英數
function TSysUT.SetCloseIme: boolean;
         var iHandleCount: integer;
             pList: array[1..nHKL_LIST] of HKL;
             szImeFileName: array[0..MAX_PATH] of char;
begin
     U_VarDef.ChangeIME:= SysUT.GetImeFileName;
     iHandleCount:= GetKeyboardLayoutList(nHKL_LIST, pList);
     if iHandleCount>0 then begin
        ImmGetDescription(pList[1], szImeFileName, MAX_PATH);
        ActivateKeyboardLayout(pList[1], 0);
        result:= True;
     end
     else result:= False;
end;    //模擬ctrl-space來切換中英文
function TSysUT.SetKey2Ime(aObj: TWinControl): boolean;
begin
     ImmSimulateHotKey(aObj.Handle, IME_THOTKEY_IME_NONIME_TOGGLE);
     result:= True;
end;    
// 取得window所有輸入法用法 GetIMEList(combobox1); // 切換到注音 (字串須依window不同版本所提供, 可用上述function查得 SetActiveIme('注音');
qoo1234
版主


發表:256
回覆:1166
積分:659
註冊:2003-02-24

發送簡訊給我
#7 引用回覆 回覆 發表時間:2003-12-19 01:25:07 IP:218.163.xxx.xxx 未訂閱
P.D 版主的粉不錯喔~佩服 < src="http://delphi.ktop.com.tw/download/upload\33223_qoo.gif">網海無涯,學無止境! 發表人 - qoo1234 於 2003/12/19 03:49:31
系統時間:2017-10-20 11:37:32
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!