發表文章

目前顯示的是 6月, 2013的文章

用 C# 控制 Win7 輸入法

圖片
參考網址 - VISTA 與輸入法程式介面 文/黃忠成 http://www.dotblogs.com.tw/code6421/archive/2010/09/27/17909.aspx (感謝上述作者提供此方便的程式,範例可從網站中下載) 由於舊的win32應用程式和.NET FRAMEWORK 2.0有些無法在VISTA以後的作業系統順利執行。控制win7作業系統輸入法亦然,但利用上述參考網址的範例在Visual Studio 2012 Desktop中開啟並執行後,會發生程式直接關閉的情形。輸出訊息最後一行如下所示: '[2672] VistaIMEHelperNet.vshost.exe: Managed (v4.0.30319)' 程式以返回碼 0 (0x0) 結束。 造成此問題是TSFWrapper.cs程式在做記憶體釋放使用到的函式 Marshal.FreeCoTaskMem(ptr) 有問題,詳細原因等待日後深入研究。目前把方法改用Marshal.FreeBSTR(ptr)的方式,即可在Win7 中執行。(後來發現是範例程式雖然是寫FreeCoTaskMem,但網址中的程式碼是寫FreeBSTR) 點擊第一個按鈕"Fetch Input Profile List"後列出所有安裝的輸入法,但只限中文輸入法。若安裝多國不同語言的輸入法,在Form1.cs中 button1_Click函式裡TSFWrapper.GetInputMethodList(langIDs[0])的langIDs可用其他值帶入,langIDs = TSFWrapper.GetLangIDs()可取得所有語言的ID。 例如:langID中文 = 1028;英文 = 1033;日文 = 1041 點選按鈕一列出所有安裝的輸入法 點擊第二項與第三項按鈕分別可切換輸入法與設定回預設英文輸入法。 不過將此做法用於非GUI的方式,也就是非windows form的方式,而是純console介面來呼叫第二與第三個按鈕function會出現crash。以下為跳出錯誤訊息視窗的內容: 類型 'System.Runtime.InteropServices.COMException' 的未處理例外狀況