在Win10作業系統,delphi 2007開發的系統,無法看到輸入法,如何處理?
Edit1.ImeName := "輸入法",這個寫法在win10用不了,怎么解決?
uj5u.com熱心網友回復:
可考慮升級到至少Delphi XE版本uj5u.com熱心網友回復:
不是輸入法,而應是輸入法的名稱。 比如:
Edit1.ImeName := "中文 - QQ五筆輸入法";
uj5u.com熱心網友回復:
用老版本的不少啊。uj5u.com熱心網友回復:
用delphi 10.2在win10試了一下,設定輸入法不起作用,結論就是升級Delphi也解決不了問題。uj5u.com熱心網友回復:
輸入法為什么不讓用戶自己選擇,而要用代碼指定呢?uj5u.com熱心網友回復:
我自動打開某一輸入法的操作,在win7下正常,win10下無動作。procedure TForm1.ComboBox70DropDown(Sender: TObject);
var
i: Integer;
begin
ComboBox70.Clear;
for i := 0 to Screen.Imes.Count - 1 do
begin
ComboBox70.Items.Add(Screen.Imes.Strings[i]);
end;
end;
uj5u.com熱心網友回復:
我用delphi 10.2在win10試了一下,設定輸入法都正常。uj5u.com熱心網友回復:
請問一下是如何設定的?直接在設計界面的錄入項選擇imename項,還是用代碼設定?
我在屬性直接選擇imename沒問題,代碼就不行(win10下)
uj5u.com熱心網友回復:
for i:=0 to ComponentCount-1 doSetVclIme(Components[i],ImeNameS,1); // 自己撰寫的輸入法函式
內容主要下列代碼
var VclClass:TComponent
StrImeName :string // 系統約定的輸入法名稱字符
TEdit(VclClass).ImeMode:=imOpen; // 打開
TEdit(VclClass).ImeName:=StrImeName;
TEdit(VclClass).ImeMode:=ImChinese; // 中文輸入法
TEdit(VclClass).ImeName:=StrImeName;
TEdit(VclClass).ImeMode:=imClose; // 關閉
TEdit(VclClass).ImeName:='';
TEdit(VclClass).ImeMode:=imSAlpha; // 英文
TEdit(VclClass).ImeName:=StrImeName;
uj5u.com熱心網友回復:
你這是控制元件里打開輸入法,我需要在全域打開輸入法,原來的screen.imes屬性在win10下好像失效了,取不到串列和名字,count=0。win7下沒問題。這樣做的原因是全屏顯示且屏蔽了任務欄,不能選擇了,只能單獨加一個輸入法選擇功能,除了在控制元件里輸入還有其他內容。
uj5u.com熱心網友回復:
win10的輸入法如果視窗沒有游標不會激活uj5u.com熱心網友回復:
特別提醒:win7,XP的輸入法支持IMM方式,
從Vista起,輸入法引入CTF方式輸入法,
Win10作業系統同時支持IMM和CTF方式,
Screen.Imes僅能讀取IMM方式的輸入法。安裝輸入法時,高版本都是CTF方式。
uj5u.com熱心網友回復:
{
Microsoft Windows 文本服務框架(TSF)
輸入法相關函數
author:HAB
}
unit uTSFUtil;
interface
uses
System.SysUtils,
System.Classes;
type
TTSFUtil = class
private
class procedure DoImes(var AInputMethods: TStrings; const AName: string = '');
public
class function GetImes: TStrings; //獲得輸入法串列
class procedure SetImeName(const AName: string); //設置系統當前輸入法
end;
implementation
uses
Winapi.MsCTF;
var
mImeList: TStrings;
type
TLanguageProfile = class
private
FName: string;
FProfile: TF_LANGUAGEPROFILE;
public
property Name: string read FName write FName;
property Profile: TF_LANGUAGEPROFILE read FProfile write FProfile;
end;
{ TTSFUtil }
class procedure TTSFUtil.DoImes(var AInputMethods: TStrings; const AName: string);
var
profiles: PPTfInputProcessorProfiles;
Iprofiles: ITfInputProcessorProfiles;
plangid: Word;
enumerator: IEnumTfLanguageProfiles;
langProfile: TF_LANGUAGEPROFILE;
FetchedItems: Cardinal;
pbstrProfile: WideString;
pfEnable: Integer;
oLanPro: TLanguageProfile;
begin
if not IsMSCTFAvailable then Exit;
New(profiles);
try
if TF_CreateInputProcessorProfiles(profiles) = S_OK then
begin
Iprofiles := ITfInputProcessorProfiles(profiles^);
Iprofiles.GetCurrentLanguage(plangid);
if plangid > 0 then
begin
Iprofiles.EnumLanguageProfiles(plangid, enumerator);
if enumerator <> nil then
begin
enumerator.Next(1, langProfile, FetchedItems);
while FetchedItems > 0 do
begin
//langProfile.fActive; // -1時為當前激活輸入法
pbstrProfile := '';
if Iprofiles.GetLanguageProfileDescription(langProfile.clsid, langProfile.langid, langProfile.guidProfile, pbstrProfile) = S_OK then
begin
if Iprofiles.IsEnabledLanguageProfile(langProfile.clsid, langProfile.langid, langProfile.guidProfile, pfEnable) = S_OK then
begin
if pfEnable = 1 then
begin
//顯示TSF輸入法名稱
oLanPro := TLanguageProfile.Create;
oLanPro.Name := pbstrProfile;
oLanPro.Profile := langProfile;
AInputMethods.AddObject(pbstrProfile, oLanPro);
//激活指定輸入法(clsid、 guidProfile為空時,取消激活)
if not AName.IsEmpty and SameText(pbstrProfile, AName) then
Iprofiles.ActivateLanguageProfile(langProfile.clsid, langProfile.langid, langProfile.guidProfile);
end;
end;
end;
enumerator.Next(1, langProfile, FetchedItems);
end;
end;
end;
end;
finally
Dispose(profiles);
end;
end;
class function TTSFUtil.GetImes: TStrings;
begin
if mImeList = nil then
begin
mImeList := TStringList.Create(True);
DoImes(mImeList, '');
end;
Result := mImeList;
end;
class procedure TTSFUtil.SetImeName(const AName: string);
var
sList: TStrings;
iIndex: Integer;
profiles: PPTfInputProcessorProfiles;
Iprofiles: ITfInputProcessorProfiles;
plangid: Word;
oLanPro: TLanguageProfile;
langProfile: TF_LANGUAGEPROFILE;
begin
sList := GetImes;
iIndex := sList.IndexOf(AName);
if iIndex > - 1 then
begin
oLanPro := TLanguageProfile(sList.Objects[iIndex]);
langProfile := oLanPro.Profile;
New(profiles);
try
if TF_CreateInputProcessorProfiles(profiles) = S_OK then
begin
Iprofiles := ITfInputProcessorProfiles(profiles^);
Iprofiles.GetCurrentLanguage(plangid);
if plangid > 0 then
begin
Iprofiles.ActivateLanguageProfile(langProfile.clsid, langProfile.langid, langProfile.guidProfile);
end;
end;
finally
Dispose(profiles);
end;
end;
end;
initialization
finalization
FreeAndNil(mImeList);
end.
uj5u.com熱心網友回復:
輸入法有十種上格式,Win初期都是IMM,如win98,XP,win7輸入法支持IMM方式,從Vista起,輸入法引入CTF方式輸入法。
你的問題,Win10作業系統同時支持IMM和CTF方式,
Screen.Imes僅能讀取IMM方式的輸入法。安裝輸入法時,高版本都是CTF方式。
如果你的Win10,使用輸入法,IMM格式的,在Win10中,通過你的方式,設定輸入法才能有效的。
所有在軟體中設定輸入法,不是一種好的辦法了。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/36026.html
標籤:數據庫相關
