以及寄信請教 TSF aware blog 作者 Eric Brown,參考日文輸入法 corvus-skk,
加上對岸強大的開發者,小小輸入法的周永 (dgod) 指點,終於知道怎麼做了。
目前新酷音輸入法,初步可以部分支援 Windows 8 modern UI,
我在 Windows 8 試用版裡面測試,已經可在 metro app 裡面使用了!
值得一提的是,對岸高手周永 (dgod),就是我認識的那位 dgod
之前我們還一起開發過 Linux 桌面 LXDE 專案,實在也太巧,
我居然不知道他會寫 TSF 輸入法!! (我猜他應該也不知道我有在寫 XD)
先前從文件上看來,Windows 8 app 模式不能使用許多舊有功能,
很多輸入法必要的 API 竟都被標注為 desktop mode only,
所以我一直想不出來怎麼做。原來,在輸入法是特例,
雖然 dll 是載入到 app container 內,但是 desktop SDK 的 API 是允許使用的。
終於找到一份文件證實這點:
http://msdn.microsoft.com/en-us/library/windows/desktop/hh848069(v=vs.85).aspx
Quote:
When an IME is loaded into a Windows Store app, it is subject to the same app container restrictions as the app itself. This behavior ensures that IMEs are not able to violate Windows Store app security contracts, despite having access to the desktop SDK (because they are not distributed or certified by the Windows Store)所以,輸入法雖然跑在 app 內,原 Win32 API 是允許的,但是存取的限制,
仍然受到 app container 安全規範,實地測試發現,可以使用 Registry 的 API
但是在 app 內嘗試讀寫系統登錄,都會造成錯誤。讀寫 app 以外的檔案也會權限不足。
故這些 API 雖然可以調用,但是只要存取到 app 不准許存取的資源,就會發生錯誤。
總結來說,目前已經可支援 Windows 8 store app,但還有許多限制沒有克服
- 使用者偏好設定,各個 app 內各自獨立,不能互相讀取,也不能讀取系統登錄,也不能存取 app 自己 package 以外的檔案,所以無法讀取設定檔,不能和 desktop mode 共用設定。微軟官方建議的方式是,建立一個 web service 來儲存這些設定。
- app 內儲存設定有自己的方式,新的 API 不相容舊版 Windows,所以可能還是需要額外幫 Windows 8 開發自己的版本
- 使用者辭庫無法在 app 內使用,因為 app 內讀不到外界的檔案,只有少數幾個許可的位置可讀取,很多更是無法寫入,但是各個 app 隨不同的 capability 又會不同。此問題目前無解。微軟官方建議的方式是,這些資料應該放在雲端。但是沒網路的時候就不能用了,Windows 8 的這種設計哲學在網路連不上的情況會很難實現。
- app mode 和 desktop mode 之間互相溝通預設不被允許,除非經過複雜的安全性設定,但是找不到如何設定的文件或範例。目前比較確定能用的,是透過 web service,只不過,為了交換少數資料,而需要架設 web server...真是殺雞焉用牛刀!
- Windows store app mode 下沒有語言列,無法顯示狀態,或存取其他功能。
也許,在 app 模式下關閉使用者辭庫功能是個可行的解法,
但是這仍然沒有解決 app 內和 desktop mode 設定要如何共用的問題。
該不會真的需要寫專用的 web server 吧....
TSF 和 32/64 位元支援都完成了,支援 Windows 8 metro app 有譜了,但還有很長的路要走。