用 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' 的未處理例外狀況發生於 VistaIMEHelperNet.exe

其他資訊: 災難性的失敗 (發生例外狀況於 HRESULT: 0x8000FFFF (E_UNEXPECTED))

目前尚未得出單純用console端去存取輸入法。可以參考下面連結使用sliverlight去call輸入法控制的dll檔。



原作者在另一篇是兩年後的更正版,並用Sliverlight呼叫此dll範例
http://www.dotblogs.com.tw/code6421/archive/2010/09/27/17916.aspx



舊有MSDN上有被提及的是在System.Windows.Forms中底下的三個函數

InputLanguage 提供方法和欄位以便於管理的輸入的語言。 這個類別無法被繼承。
InputLanguageChangedEventArgs 提供 InputLanguageChanged 事件的資料。
InputLanguageChangingEventArgs 提供 InputLanguageChanging 事件的資料。

只能在Win7中取得輸入法訊息,不能夠做修改輸入法的動作。

留言

這個網誌中的熱門文章

[專案] 銀行端末系統

如何在MacOS 中自由切換不同Python版本 - pyenv + virtualenv