none
列舉輸入法, 抓不到輸入法的正確名稱? RRS feed

  • 問題

  • 日前看到這篇
    https://dotblogs.com.tw/yc421206/archive/2009/08/09/9966.aspx

    可是近日實際測試
    卻發現只抓到        input.LayoutName =   "中文 (繁體) - 美式鍵盤"
    而不是我要的 "微軟新注音" 或類似的名稱

    然後用Google 找到 ImmGetDescription 的用法
    然後寫了

           [DllImport("Imm32.dll", CharSet=CharSet.Auto)]
            public extern static int ImmGetDescription(IntPtr Hkl, StringBuilder sbName, int nBuffer);  
       
    
            private static string GetImmName(InputLanguage input)
            {
                int nBuffer = 0;
                string sDesc = "";
    
                nBuffer = ImmGetDescription(input.Handle, null, nBuffer);
                if (nBuffer != 0)
                {
                    StringBuilder sbName = new StringBuilder(nBuffer);
                    ImmGetDescription(input.Handle, sbName, nBuffer);
                    sDesc = sbName.ToString();
                }
                if (string.IsNullOrEmpty(sDesc))
                {
                    sDesc = input.LayoutName;
                }
    
                return sDesc;
            }  

    可是還是依然抓不到輸入法的正確名稱?

    player

    2017年4月21日 上午 07:57

解答

  • InputLanguage.LayoutName 屬性所取得的叫做 "鍵盤配置名稱",不是叫做 "輸入法"
    那招只能用在 XP, 在 VISTA 後就失效了。
    請用  Text Services Framework 替代

    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。


    2017年4月21日 上午 08:05
    版主

所有回覆

  • InputLanguage.LayoutName 屬性所取得的叫做 "鍵盤配置名稱",不是叫做 "輸入法"
    那招只能用在 XP, 在 VISTA 後就失效了。
    請用  Text Services Framework 替代

    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。


    2017年4月21日 上午 08:05
    版主
  • 那麼有其他方法可以抓到電腦中已安裝的輸入法名稱的方法嗎?


    player

    2017年4月21日 上午 08:15
  • 我剛補充了 用   Text Services Framework 替代

    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。

    2017年4月21日 上午 08:18
    版主
  • 那樣是說C# 或 .NET Framework 裡
    沒有能夠直接列舉輸入法名稱的方法嗎?

    而是得用C++另外寫一個dll
    Text Services Framework 的操作包起來才能給C# 用嗎?

    player

    2017年4月21日 上午 08:27
  • 應該不用這麼麻煩吧,我記得他是個 COM 啊


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。

    2017年4月21日 上午 08:32
    版主
  • 因為我找到的TSF範例是C++寫的, 而且幾乎找不到C# 去Call TSF的範例
    所以才誤會C#沒辦法直接Call TSF來用
    http://blog.csdn.net/puncha/article/details/13003065

    在看看該怎麼用了

    player

    2017年4月21日 上午 08:40
  • 找到C#的範例了
    http://www.taliove.com/2016/csharp-tsf-get-input/

    它說要找 MSCTF.DLL 來用
    可是Windows裡這個同名的檔案一堆

    要把 C:\Windows\System32\MSCTF.DLL
    加到C#專案裡的參考
    結果加不進去? 謎? 它不是COM嗎?

    用 C:\Program Files (x86)\Windows Kits\8.1\bin\x64\oleview.exe
    這個查看COM的工具
    也打不開它? 謎?



    player



    • 已編輯 p1ayer 2017年4月21日 下午 02:44
    2017年4月21日 上午 09:16