乘乗 | 亞亜 | 佛仏 | 來来 | 傳伝 | 僞偽 | 價価 | 儉倹 | 兒児 | 冨富 |
凉涼 | 剩剰 | 劍剣 | 勳勲 | 卷巻 | 卽即 | 單単 | 嚴厳 | 圈圏 | 國国 |
圓円 | 團団 | 埜野 | 增増 | 壘塁 | 壞壊 | 壯壮 | 壽寿 | 奧奥 | 奬奨 |
孃嬢 | 寢寝 | 實実 | 寬寛 | 將将 | 專専 | 峯峰 | 峽峡 | 嶋島 | 巢巣 |
帶帯 | 廣広 | 廳庁 | 彈弾 | 從従 | 徵徴 | 德徳 | 恆恒 | 惠恵 | 惡悪 |
愼慎 | 應応 | 懷懐 | 戰戦 | 戲戯 | 拂払 | 拔抜 | 拜拝 | 揭掲 | 搖揺 |
搜捜 | 擊撃 | 攝摂 | 收収 | 敍叙 | 晚晩 | 晝昼 | 曆暦 | 曉暁 | 條条 |
榮栄 | 樂楽 | 樣様 | 橫横 | 檢検 | 櫻桜 | 步歩 | 歷歴 | 每毎 | 氣気 |
涉渉 | 淚涙 | 淨浄 | 渴渇 | 溫温 | 滯滞 | 澁渋 | 濕湿 | 瀧滝 | 瀨瀬 |
燈灯 | 燒焼 | 爭争 | 爲為 | 狀状 | 狹狭 | 獸獣 | 疊畳 | 盃杯 | 盜盗 |
盡尽 | 眞真 | 碎砕 | 祕秘 | 禪禅 | 禮礼 | 稻稲 | 穗穂 | 粹粋 | 綠緑 |
緖緒 | 緣縁 | 縣県 | 縱縦 | 纖繊 | 聽聴 | 臟臓 | 與与 | 莊荘 | 萬万 |
薗園 | 薰薫 | 藏蔵 | 藝芸 | 藥薬 | 虛虚 | 衞衛 | 裝装 | 覽覧 | 謠謡 |
讓譲 | 賣売 | 賴頼 | 轉転 | 郞郎 | 醉酔 | 釀醸 | 錄録 | 鍊錬 | 鎭鎮 |
鑄鋳 | 陷陥 | 險険 | 雜雑 | 靜静 | 顯顕 | 飜翻 | 駈駆 | 騷騒 | 驗験 |
髮髪 | 鷄鶏 | 黃黄 | 黑黒 | 默黙 | 齊斉 | 龍竜 | 稱称 | 涉渉 | 狀状 |
瀨瀬 | 雙双 | 巢巣 | 增増 | 徵徴 | 鬬闘 | 德徳 | 晚晩 | 步歩 | 豐豊 |
每毎 | 賴頼 | 綠緑 | 淚涙 | 戾戻 | 曆暦 | 歷歴 | 鍊錬 | 錄録 | 亞亜 |
惡悪 | 壓圧 | 圍囲 | 醫医 | 爲為 | 壹壱 | 隱隠 | 榮栄 | 營営 | 衞衛 |
驛駅 | 圓円 | 鹽塩 | 緣縁 | 應応 | 歐欧 | 毆殴 | 櫻桜 | 奧奥 | 橫横 |
溫温 | 穩穏 | 假仮 | 價価 | 畫画 | 會会 | 繪絵 | 壞壊 | 懷懐 | 擴拡 |
殼殻 | 覺覚 | 學学 | 嶽岳 | 樂楽 | 渴渇 | 罐缶 | 卷巻 | 陷陥 | 勸勧 |
寬寛 | 關関 | 歡歓 | 觀観 | 氣気 | 歸帰 | 僞偽 | 戲戯 | 犧犠 | 舊旧 |
據拠 | 擧挙 | 虛虚 | 峽峡 | 挾挟 | 狹狭 | 鄉郷 | 曉暁 | 區区 | 驅駆 |
勳勲 | 薰薫 | 徑径 | 莖茎 | 惠恵 | 揭掲 | 溪渓 | 經経 | 螢蛍 | 輕軽 |
繼継 | 鷄鶏 | 藝芸 | 擊撃 | 缺欠 | 縣県 | 儉倹 | 嚴厳 | 廣広 | 效効 |
恆恒 | 黃黄 | 鑛鉱 | 號号 | 國国 | 黑黒 | 碎砕 | 濟済 | 齋斎 | 劑剤 |
雜雑 | 參参 | 棧桟 | 蠶蚕 | 慘惨 | 贊賛 | 殘残 | 絲糸 | 齒歯 | 兒児 |
辭辞 | 濕湿 | 實実 | 寫写 | 釋釈 | 壽寿 | 收収 | 從従 | 澁渋 | 獸獣 |
縱縦 | 肅粛 | 處処 | 敍叙 | 將将 | 燒焼 | 證証 | 奬奨 | 繩縄 | 壤壌 |
孃嬢 | 讓譲 | 釀醸 | 條条 | 乘乗 | 淨浄 | 剩剰 | 疊畳 | 觸触 | 囑嘱 |
眞真 | 寢寝 | 愼慎 | 盡尽 | 圖図 | 粹粋 | 醉酔 | 穗穂 | 隨随 | 髓髄 |
樞枢 | 數数 | 聲声 | 齊斉 | 靜静 | 竊窃 | 攝摂 | 專専 | 淺浅 | 戰戦 |
踐践 | 錢銭 | 潛潜 | 纖繊 | 禪禅 | 壯壮 | 爭争 | 莊荘 | 搜捜 | 插挿 |
裝装 | 總総 | 騷騒 | 藏蔵 | 臟臓 | 墮堕 | 屬属 | 續続 | 對対 | 體体 |
帶帯 | 滯滞 | 臺台 | 瀧滝 | 擇択 | 澤沢 | 擔担 | 單単 | 膽胆 | 團団 |
斷断 | 彈弾 | 遲遅 | 癡痴 | 蟲虫 | 晝昼 | 鑄鋳 | 廳庁 | 聽聴 | 敕勅 |
鎭鎮 | 遞逓 | 鐵鉄 | 點点 | 轉転 | 傳伝 | 燈灯 | 當当 | 黨党 | 盜盗 |
稻稲 | 獨独 | 讀読 | 屆届 | 貳弐 | 惱悩 | 腦脳 | 霸覇 | 拜拝 | 廢廃 |
賣売 | 麥麦 | 發発 | 髮髪 | 拔抜 | 蠻蛮 | 祕秘 | 濱浜 | 拂払 | 佛仏 |
竝並 | 邊辺 | 變変 | 寶宝 | 襃褒 | 飜翻 | 萬万 | 滿満 | 默黙 | 譯訳 |
藥薬 | 與与 | 豫予 | 餘余 | 譽誉 | 搖揺 | 樣様 | 謠謡 | 來来 | 亂乱 |
覽覧 | 龍竜 | 兩両 | 獵猟 | 壘塁 | 禮礼 | 勵励 | 靈霊 | 齡齢 | 戀恋 |
爐炉 | 勞労 | 樓楼 | 灣湾 | 辨弁 | 瓣弁 | 辯弁 | 0 | 0 | 0 |
本來這個blog是記錄開發輸入法的點滴的,後來越來越雜,現在什麼都記錄了。
2008年10月30日 星期四
繁體字轉換日文漢字的表格
2008年10月24日 星期五
微軟公佈的 TSF 輸入法例子的問題
在之前版本的歪林輸入法,其中一個問題就是當在某程式打字時,切換去另一個程式,歪林輸入法的視窗不會自動隱藏。
其原因是歪林輸入法是基於微軟的"Sample Code for Text Services Framework",裡面沒有將視窗自動隱藏的部分。
後來在網友zhangruisen 的電郵中,得知只要在程式碼中,添加IID_ITfThreadFocusSink事件接收器,然后在相應的函數里(即STDAPI CTextService::OnSetThreadFocus() 和 STDAPI CTextService::OnKillThreadFocus() )顯示/隱藏窗口即可。在 Windows SDK 的 Samples\WinUI\TSFcase 有範例程式碼。
得此訊息後,就在歪林輸入法加了:
BOOL CTextService::_InitThreadFocusSink() { HRESULT hr; ITfSource *pSource = NULL; if (_pThreadMgr->QueryInterface(IID_ITfSource, (void **)&pSource) != S_OK) return FALSE; hr = pSource->AdviseSink(IID_ITfThreadFocusSink, (ITfThreadFocusSink *)this, &_dwThreadFocusSinkCookie); pSource->Release(); return (hr == S_OK); } // _UninitThreadFocusSink // Unadvise a Focus sink. Assumes a sink has been advised already. void CTextService::_UninitThreadFocusSink() { ITfSource *pSource; if (_pThreadMgr->QueryInterface(IID_ITfSource, (void **)&pSource) != S_OK) return; pSource->UnadviseSink(_dwThreadFocusSinkCookie); pSource->Release(); } STDAPI CTextService::OnSetThreadFocus() { if (_pCandidateWin) _pCandidateWin->Show(TRUE); return S_OK; } STDAPI CTextService::OnKillThreadFocus() { if (_pCandidateWin) _pCandidateWin->Show(FALSE); return S_OK; } |
在加入上面程式碼後,以為在 CTextService::Activate() 裡面呼叫 CTextService::_InitThreadFocusSink() 就可以了。怎料,每次呼叫這函數,都 返回 S_FAILED 值。這問題一直困擾我很久,超越大半年時間。(也是因為懶惰)
直到昨天晚上下班後,又提起精神,再仔細比較 Windows SDK 的 TSF Case 和我 歪林輸入法程式碼的分別。終於找到了!原來:
STDAPI CTextService::QueryInterface(REFIID riid, void **ppvObj) { if (ppvObj == NULL) return E_INVALIDARG; *ppvObj = NULL; if (IsEqualIID(riid, IID_IUnknown) || IsEqualIID(riid, IID_ITfTextInputProcessor)) { *ppvObj = (ITfTextInputProcessor *)this; } else if (IsEqualIID(riid, IID_ITfThreadMgrEventSink)) { *ppvObj = (ITfThreadMgrEventSink *)this; }
else if (IsEqualIID(riid, IID_ITfTextEditSink)) { |
Windows SDK 的 TSF Case 有「框」的部分,而歪林輸入法和其他 TSF Sample code 就沒有。一加了上面的 code,歪林輸入法就可以在切換視窗時,自動隱蔽起來。
天啊!一耽誤就是半年!