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也不顯示中文。