Example #1
0
        /// <summary>
        /// 取得所有的輸入法名稱。
        /// </summary>
        /// <param name="langId">Language ID。</param>
        /// <returns>包含輸入法名稱的字串陣列。</returns>
        public static string[] GetInputMethods(short langId)
        {
            List <string>             imeList = new List <string>();
            ITfInputProcessorProfiles profiles;

            if (TsfApi.TF_CreateInputProcessorProfiles(out profiles) == 0)
            {
                try
                {
                    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)
                                {
                                    imeList.Add(Marshal.PtrToStringBSTR(ptr));
                                }
                                Marshal.FreeBSTR(ptr);
                            }
                        }
                    }
                }
                finally
                {
                    Marshal.ReleaseComObject(profiles);
                }
            }
            return(imeList.ToArray());
        }
Example #2
0
        /// <summary>
        /// 啟用/移除指定的輸入法。作用等同於在控制台的「文字服務和輸入語言」對話窗裡面新增和移除輸入法。
        /// Note: 移除時儘管 API 傳回成功,但有時侯會出現輸入法並未真正移除的情形。
        /// </summary>
        /// <param name="langId">輸入語言的 language ID。</param>
        /// <param name="imeName">完整的輸入法名稱。例如:中文 (繁體) - 新注音。</param>
        /// <param name="isEnable">啟用或是移除。</param>
        /// <returns></returns>
        public static bool EnableInputMethod(short langId, string imeName, bool isEnable)
        {
            ITfInputProcessorProfiles profiles;

            if (TsfApi.TF_CreateInputProcessorProfiles(out profiles) != 0)
            {
                return(false);
            }

            try
            {
                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)
                            {
                                string s = Marshal.PtrToStringBSTR(ptr);
                                if (s.Equals(imeName))
                                {
                                    bool enabled;
                                    if (profiles.IsEnabledLanguageProfile(ref langProfile[0].clsId,
                                                                          langProfile[0].langId, ref langProfile[0].guidProfile, out enabled) == 0)
                                    {
                                        if (enabled != isEnable)
                                        {
                                            if (profiles.EnableLanguageProfile(
                                                    ref langProfile[0].clsId, langProfile[0].langId, ref langProfile[0].guidProfile, isEnable) == 0)
                                            {
                                                return(true);
                                            }
                                        }
                                    }
                                }
                                Marshal.FreeBSTR(ptr);
                            }
                        }
                    }
                }
            }
            finally
            {
                Marshal.ReleaseComObject(profiles);
            }
            return(false);
        }