VISTA 与输入法程式介面
VISTA 与输入法程式介面
|
public void GetLanguages()
{
(在InputLanguage.InstalledInputLanguages中的InputLanguage lang)
{
textBox1.Text + = lang.Culture.EnglishName +'\ n';
}
}
|
|
///////////////////////////////////////////////////////////////////////////////////////////////
// Microsoft文本服务框架声明
//从C ++头文件
//
//////////////////////////////////////////////////////////////////////////////////////////////
使用
系统;
使用
System.ComponentModel;
使用
System.Collections.Generic;
使用
System.Text;
使用
System.Runtime.InteropServices;
使用
System.Security;
命名空间
TSF
{
[
StructLayout
(
LayoutKind
.Sequential)]
内部
结构
TF_LANGUAGEEPROFILE
{
内部
Guid
clsid;
内部
短
LANGID;
内部
Guid
catid;
[
MarshalAs
(
UnmanagedType
.Bool)]
内部
布尔
功能;
内部
Guid
guidProfile;
}
[
ComImport
,
SecurityCritical
,
SuppressUnmanagedCodeSecurity
,
Guid
(
“1F02B6C5-7842-4EE6-8A0B-9A24183A95CA”
),
InterfaceType
(
ComInterfaceType
.InterfaceIsIUnknown)]
内部
接口
ITfInputProcessorProfiles
{
[
SecurityCritical
]
void
Register();
//非执行!可能是错误的声明。
[
SecurityCritical
]
void
Unregister();
//非执行!可能是错误的声明。
[
SecurityCritical
]
void
AddLanguageProfile();
//非执行!可能是错误的声明。
[
SecurityCritical
]
void
RemoveLanguageProfile();
//非执行!可能是错误的声明。
[
SecurityCritical
]
void
EnumInputProcessorInfo();
//非执行!可能是错误的声明。
[
SecurityCritical
]
int
GetDefaultLanguageProfile(
short
langid,
ref
Guid
catid,
out
Guid
clsid,
out
Guid
profile);
[
SecurityCritical
]
void
SetDefaultLanguageProfile();
//非执行!可能是错误的声明。
[
SecurityCritical
]
int
ActivateLanguageProfile(
ref
Guid
clsid,
short
langid,
ref
Guid
guidProfile);
[
PreserveSig
,
SecurityCritical
]
int
GetActiveLanguageProfile(
ref
Guid
clsid,
out
short
langid,
out
Guid
profile);
[
SecurityCritical
]
int
GetLanguageProfileDescription(
ref
Guid
clsid,
short
langid,
ref
Guid
profile,
out
IntPtr
desc);
[
SecurityCritical
]
void
GetCurrentLanguage(
out
short
langid);
//非执行!可能是错误的声明。
[
PreserveSig
,
SecurityCritical
]
int
ChangeCurrentLanguage(
short
langid);
//非执行!可能是错误的声明。
[
PreserveSig
,
SecurityCritical
]
int
GetLanguageList (
out
IntPtr
langids,
out
int
count);
[
SecurityCritical
]
int
EnumLanguageProfiles(
short
langid,
out
IEnumTfLanguageProfiles
enumIPP);
[
SecurityCritical
]
int
EnableLanguageProfile();
[
SecurityCritical
]
int
IsEnabledLanguageProfile(
ref
guid
clsid,
short
langid,
ref
Guid
profile,
out
bool
enabled);
[
SecurityCritical
]
void
EnableLanguageProfileByDefault();
//非执行!可能是错误的声明。
[
SecurityCritical
]
void
SubstituteKeyboardLayout();
//非执行!可能是错误的声明。
}
[
ComImport
,
InterfaceType
(
ComInterfaceType
.InterfaceIsIUnknown),
Guid
(
“3d61bf11-ac5f-42c8-a4cb-931bcc28c744”
)]
内部
接口
IEnumTfLanguageProfiles
{
无效
克隆(
输出
IEnumTfLanguageProfiles
enumIPP);
[
PreserveSig
]
int
Next(
int
count,[
Out
,
MarshalAs
(
UnmanagedType
.LPArray,SizeParamIndex = 2)]
TF_LANGUAGEPROFILE
[] profiles,
out
int
fetched);
无效
重置();
无效
跳过(
int
count);
}
内部
静态
类
TSF_NativeAPI
{
公共
静态
只读
guid
GUID_TFCAT_TIP_KEYBOARD;
静态
TSF_NativeAPI()
{
GUID_TFCAT_TIP_KEYBOARD =
新的
Guid
(0x34745c63,0xb2f0,
0x4784,0x8b,0x67,0x5e,0x12,200x,0x1a,0x31);
}
[
SecurityCritical
,
SuppressUnmanagedCodeSecurity
,
DllImport
(
“msctf.dll”
)]
public
static
extern
int
TF_CreateInputProcessorProfiles(
out
ITfInputProcessorProfiles
profiles);
}
}
|
|
public
static short [] GetLangIDs()
{
List
<
short
> langIDs =
new
List
<
short
>();
ITfInputProcessorProfiles
配置文件;
如果
(
TSF_NativeAPI
.TF_CreateInputProcessorProfiles(
out
profiles)== 0)
{
IntPtr
langPtrs;
int
fetchCount = 0;
if
(profiles.GetLanguageList(
out
langPtrs,
out
fetchCount)== 0)
{
for
(
int
i = 0; i <fetchCount; i ++)
{
short
id =
Marshal
.ReadInt16(langPtrs,
sizeof
(
short
)* i);
langIDs.Add(ID);
}
}
Marshal
.ReleaseComObject(profiles);
}
返回
langIDs.ToArray();
}
public
static string [] GetInputMethodList(short langID)
{
List
<
string
> imeList =
new
List
<
string
>();
ITfInputProcessorProfiles
配置文件;
如果
(
TSF_NativeAPI
.TF_CreateInputProcessorProfiles(
out
profiles)== 0)
{
尝试
{
IEnumTfLanguageProfiles
enumerator =
null
;
if
(profiles.EnumLanguageProfiles(langID,
out
enumerator)== 0)
{
if
(enumerator!=
null
)
{
TF_LANGUAGEPROFILE
[] langProfile =
new
TF_LANGUAGEPROFILE
[1];
int
fetchCount = 0;
while
(enumerator.Next(1,langProfile,
out
fetchCount)== 0)
{
IntPtr
ptr;
if
(profiles.GetLanguageProfileDescription(
ref
langProfile [0] .clsid,
langProfile [0] .langid,
ref
langProfile [0] .guidProfile,
out
ptr)== 0)
{
布尔
启用;
if
(profiles.IsEnabledLanguageProfile(
ref
langProfile [0] .clsid,
langProfile [0] .langid,
ref
langProfile [0] .guidProfile,
out
enabled)== 0)
{
如果
(启用)
imeList.Add(
Marshal
.PtrToStringBSTR(ptr));
}
}
Marshal.FreeBSTR(ptr);
}
}
}
}
最后
{
Marshal
.ReleaseComObject(profiles);
}
}
return
imeList.ToArray();
}
|
|
私人
短 [] langIDs;
………
private
void button1_Click(object sender,EventArgs e)
{
langIDs =
TSFWrapper
.GetLangIDs();
如果
(langIDs.Length> 0)
{
string
[] list =
TSFWrapper
.GetInputMethodList(langIDs [0]);
的foreach
(
字符串
递减
的
列表)
listBox1.Items.Add(降序);
}
}
|
|
public
static bool ActiveInputMethodWithDesc(short langID,string desc)
{
ITfInputProcessorProfiles
配置文件;
如果
(
TSF_NativeAPI
.TF_CreateInputProcessorProfiles(
out
profiles)== 0)
{
尝试
{
IEnumTfLanguageProfiles
enumerator =
null
;
if
(profiles.EnumLanguageProfiles(langID,
out
enumerator)== 0)
{
if
(enumerator!=
null
)
{
TF_LANGUAGEPROFILE
[] langProfile =
new
TF_LANGUAGEPROFILE
[1];
int
fetchCount = 0;
while
(enumerator.Next(1,langProfile,
out
fetchCount)== 0)
{
IntPtr
ptr;
if
(profiles.GetLanguageProfileDescription(
ref
langProfile [0] .clsid,
langProfile [0] .langid,
ref
langProfile [0] .guidProfile,
out
ptr)== 0)
{
布尔
启用;
if
(profiles.IsEnabledLanguageProfile(
ref
langProfile [0] .clsid,
langProfile [0] .langid,
ref
langProfile [0] .guidProfile,
out
enabled)== 0)
{
如果
(启用)
{
string
s =
Marshal
.PtrToStringBSTR(ptr);
if
(s.Equals(desc))
返回
profiles.ActivateLanguageProfile(
参考
langProfile [0] .clsid,
langProfile [0] .langid,
ref
langProfile [0] .guidProfile)== 0;
}
}
Marshal.FreeBSTR(ptr);
}
}
}
}
}
最后
{
Marshal
.ReleaseComObject(profiles);
}
}
返回
false
;
}
|
|
private
void button2_Click(object sender,EventArgs e)
{
如果
(langIDs!=
null
)
{
if
(listBox1.SelectedIndex!= -1)
TSFWrapper
.ActiveInputMethodWithDesc(langIDs [0],(
string
)listBox1.SelectedItem);
}
}
|
|
public
static bool DeActiveInputMethod(short langID)
{
List
<
string
> imeList =
new
List
<
string
>();
ITfInputProcessorProfiles
配置文件;
如果
(
TSF_NativeAPI
.TF_CreateInputProcessorProfiles(
out
profiles)== 0)
{
尝试
{
Guid
clsid =
Guid
.Empty;
返回
profiles.ActivateLanguageProfile(
ref
clsid,langID,
ref
clsid)== 0;
}
最后
{
Marshal
.ReleaseComObject(profiles);
}
}
返回
false
;
}
|