Windows2000下指定輸入法 |
|
panda566
一般會員 發表:3 回覆:4 積分:1 註冊:2002-03-25 發送簡訊給我 |
|
scottliou
版主 發表:16 回覆:56 積分:47 註冊:2002-03-14 發送簡訊給我 |
|
panda566
一般會員 發表:3 回覆:4 積分:1 註冊:2002-03-25 發送簡訊給我 |
|
andersonhsieh
版主 發表:33 回覆:531 積分:439 註冊:2002-06-10 發送簡訊給我 |
引言: 各位大大安安 我下載了Windows2000下指定輸入法的範例, 已可以切換各種輸入法了 但... 怎麼切換回英數ㄚ???< > 範例中有一段有寫, 但好像沒作用ㄋㄟ~~~ 煩請各位大大解說, 謝謝啦!!< >以下是我去年寫的兩個關於輸入法的函數,參考看看 // -------------------------------------------------------- // -------------------------------------------------------- // procedure : 中/英文輸入切換 // parameters : ImeStates(OpenIme, CloseIme) 要開啟/關閉中文輸入法(開/關) // Handles(要切換輸入法的control的HANDLE) // author : 謝榮沛 // -------------------------------------------------------- procedure ChangeIME(ImeStates : TImeState; Handles : THandle); var hlkCurrent : HKL; DefaultHKL : String; Reg: TRegIniFile; begin Reg := TRegIniFile.Create('SOFTWARE\TFN'); DefaultHKL := Reg.ReadString('', 'DefaultHKL', 'e0010404'); Reg.CloseKey; Reg.Free; hlkCurrent := GetKeyboardLayout(0); case ImeStates of CloseIme : begin if ImmIsIME(hlkCurrent) then hlkCurrent := LoadKeyboardLayout('00000409', KLF_ACTIVATE); // ImmSimulateHotKey(Handles, IME_THotKey_IME_NonIME_Toggle); end; OpenIme : begin if not ImmIsIME(hlkCurrent) then hlkCurrent := LoadKeyboardLayout(pchar(DefaultHKL), KLF_ACTIVATE); // ImmSimulateHotKey(Handles, IME_THotKey_IME_NonIME_Toggle); end; end; ActivateKeyboardLayout(hlkCurrent, KLF_REORDER); end; //------------------------------------------------------------// // procedure : 取得系統安裝的輸入法 // // author : 謝榮沛 2000/06/30 // //Text:輸入法的說明,Value:輸入法的代碼 // //------------------------------------------------------------// procedure GetIME(Text, Value : TStrings); var reg : TRegIniFile; i : integer; s, t : TStringList; temp : String; begin Value.Clear; Text.Clear; reg := TRegIniFile.Create; reg.RootKey := HKEY_LOCAL_MACHINE; reg.OpenKey('SYSTEM\ControlSet001\Control\Keyboard Layouts', False); t := TStringList.Create; s := TStringList.Create; reg.GetKeyNames(t); for i := t.Count-1 downto 0 do begin if UpperCase(copy(t.Strings[i], 1, 1))='E' then s.Add(t.Strings[i]); end; for i := 0 to s.Count-1 do begin temp := reg.ReadString(s.Strings[i], 'Layout Text', ''); Text.Add(temp); Value.Add(s.Strings[i]); end; reg.Free; s.Free; t.Free; end; @@~~飛翔在天際的精靈~~@@
------
@@~~飛翔在天際的精靈~~@@ |
andy_lin18
一般會員 發表:1 回覆:11 積分:2 註冊:2003-06-03 發送簡訊給我 |
|
P.D.
版主 發表:603 回覆:4038 積分:3874 註冊:2006-10-31 發送簡訊給我 |
引言: 對不起, 舊飯新炒一下, 請教大大們: 依範例, 手動方式選擇所要的輸入法, 已大致了解, 但問題若改為由程式自行detect目前USer所慣用的輸入法(預設), 待輸入欄位為中文時,自動將輸入法改為其所慣用者, 而當跳下一非為中文欄位時, 又會自動切為英數輸入法時, 則應如何實作呢? (因程式可能有多人使用, 而每人之輸入法又可能不同, 故有此一問)在此先謝謝了!你可以用模擬CTRL_SPACE方式作業, 如果上次停在新注音, 就是新注音-英數, 如果是倉額, 就是倉頡-英數這樣的切換 function SetKey2Ime(aObj: TWinControl): boolean; //模擬ctrl-space來切換中英文 function TSysUT.SetKey2Ime(aObj: TWinControl): boolean; begin ImmSimulateHotKey(aObj.Handle, IME_THOTKEY_IME_NONIME_TOGGLE); result:= True; end; |
andy_lin18
一般會員 發表:1 回覆:11 積分:2 註冊:2003-06-03 發送簡訊給我 |
So, 綜合各位大大的指導, 特匯集輸入法切換如下: (edit1~edit4為使用指定方式, edit5 則模擬CTRL_SPACE方式作切換. 若尚有改進空間, 還請多指教!! TKs unit Unit1; interface uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Imm; type
TForm1 = class(TForm)
Edit1: TEdit;
Edit2: TEdit;
Edit3: TEdit;
Edit4: TEdit;
Edit5: TEdit;
procedure Edit1Enter(Sender: TObject);
procedure Edit2Enter(Sender: TObject);
procedure Edit3Enter(Sender: TObject);
procedure Edit4Enter(Sender: TObject);
procedure Edit5Enter(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
const
nHKL_LIST = 20; var
Form1: TForm1; implementation {$R *.dfm} 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);
// 看看是否安裝了這個輸入法
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) or (sWanted = sImeFileName) then
begin // En 時, 其值為''
bInstalled := True;
Break;
end;
end;
// 如果這個輸入法已安裝了, 讓那個輸入法的鍵盤分佈(KeyLayout)作用
if bInstalled then
begin
ActivateKeyboardLayout(pList[i], 0);
if (sWanted = sImeFileName) then
Result := False
else
Result := True;
end;
end; { of SetActivateIme } function SetKey2Ime(aObj: TWinControl): boolean;
begin
ImmSimulateHotKey(aObj.Handle, IME_THOTKEY_IME_NONIME_TOGGLE);
result:= True;
end; procedure TForm1.Edit1Enter(Sender: TObject);
begin
SetActivateIme('注音'); end; procedure TForm1.Edit2Enter(Sender: TObject);
begin
SetActivateIme('倉頡'); end; procedure TForm1.Edit3Enter(Sender: TObject);
begin
SetActivateIme('大易'); end; procedure TForm1.Edit4Enter(Sender: TObject);
begin
SetActivateIme(''); // 切回英數 end; procedure TForm1.Edit5Enter(Sender: TObject);
begin
if not SetActivateIme('') then // 判斷是英數時才作切換
SetKey2Ime(self);
end; end.
|
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |