[輸入法]及 [切換輸入法] |
|
panda566
一般會員 發表:3 回覆:4 積分:1 註冊:2002-03-25 發送簡訊給我 |
各位前輩, 大家好...^_^ 一直以來我都是以<錢達智前輩的-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 發送簡訊給我 |
|
panda566
一般會員 發表:3 回覆:4 積分:1 註冊:2002-03-25 發送簡訊給我 |
|
lee
站長 發表:55 回覆:173 積分:45 註冊:2002-02-27 發送簡訊給我 |
試試我改好的!
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 發送簡訊給我 |
|
ubong
一般會員 發表:2 回覆:42 積分:23 註冊:2002-10-02 發送簡訊給我 |
各位大大:我是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 發送簡訊給我 |
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 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |