19.9.21日報:修復flash中文問題
- 2019 年 10 月 25 日
- 筆記
版權聲明:本文為部落客原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接和本聲明。
本文鏈接:https://blog.csdn.net/weolar/article/details/101085406
flash的中文問題比較麻煩,參考了chrome的程式碼:E:mycodechromium.bb-mastersrccontentchildnpapiwebplugin_ime_win.h
得知,要IAT hook flash里的ImmAssociateContextEx api。原因是因為flash是通過這幾個api去取ime發來的字元串,而不是通過WM_CHAR消息。
然後在這裡我遇到了第一個坑。
我移植了程式碼後,發現還是打不了中文,但輸入法輸入的英文是有反應的。所以我猜測flash內部會在WM_CHAR消息里獲取是輸入法傳來的,還是直接鍵盤消息。所以我攔截了ImmGetProperty,然後返回0xd000a。吐槽一下,這個0xd000a我至今都不知道什麼意思,微軟文檔也沒寫啥。
這時更奇怪的現象出現了,中文可以顯示,但輸入法輸入的英文有問題。
具體如下:
IME 發英文字母消息: go compositionUpdated: 正常顯示一個 go dispatchNPEvent: 不能顯示 什麼都不走: 不能顯示
keyboard 發英文字母消息: go compositionUpdated: 可以顯示,但有兩個同樣字母 go dispatchNPEvent: 正常顯示一個 什麼都不走: 正常顯示一個
所以我打算找個api判斷下這個WM_CHAR消息是來自輸入法還是直接鍵盤消息。我用的也是ImmGetProperty,
因為我發現這貨在非輸入法消息,也就是鍵盤消息下會返回0xd000a。但比較坑的是,win7下沒問題,win10下卻無論輸入法消息還是普通鍵盤消息都返回0xd000a。
最後我的解決方案是用WM_IME_CHAR。因為這個消息在非輸入法下是沒有的。但此時依然要hook ImmGetProperty,返回0xd000a。另外還有個小點,就是要記得發送WM_SETFOCUS。不然flash也不顯示中文。