如何讓全屏遊戲的文字編輯框支援IME和TSF輸入法

2021-07-15 20:50:01 字數 1876 閱讀 1659

文章首發:

導致這個問題的原因是tsf與ime不相容,且從win7開始tsf(高階文字服務)預設是開啟狀態,並且無法關閉。這個情況在win8下更嚴重。

要解決這個問題要從tsf框架的引入導致的相容性問題入手。首先先了解下文字編輯框用到的ime相關的api和相關概念。

api與訊息

組詞視窗 組詞視窗顯示了當前已經鍵入的字串行

候選詞視窗 候選詞視窗列出可以選擇的字或詞

tsf對輸入框架重新進行了設計,基於com元件實現,部分原有的訊息與api已不能正常工作

程式需要作調整,能夠同時支援tip和ime

獲取輸入法名字示例**

/* 獲取hkl的顯示名字

*/bool getlayoutname(const

wchar_t* kl, wchar_t* nm )

regclosekey(hkey);

if (lret == error_success && wcslen(nm) < 64)

return

false;

}/* 獲取當前輸入法名字

*/ else

if (tip.dwprofiletype == tf_profiletype_keyboardlayout)

}return _lasttipname;

}

tip相關訊息處理

; tfclientid cid;

if (failed(m_pthreadmgrex->activateex(&cid, tf_tmae_uielementenabledonly)))

itfsource *srctm;

if (succeeded(hr = m_pthreadmgrex->queryinte***ce(__uuidof(itfsource), (void

**)&srctm)))

hr = cocreateinstance(clsid_tf_inputprocessorprofiles, null, clsctx_inproc_server, iid_itfinputprocessorprofiles, (lpvoid*)&m_pprofiles);

if (failed(hr))

return

false;

m_pprofiles->queryinte***ce(iid_itfinputprocessorprofilemgr, (void

**)&_pprofilemgr);

return s_ok;

}**ppvobj)

return e_nointe***ce;

} if (succeeded(pelement->queryinte***ce(iid_itfreadinginformationuielement, (void

**)&lpreading)))

safe_release(pelement);

}safe_release(lpmgr);

}return s_ok;

} safe_release(pcontex);

}safe_release(pdocmgr);

}if (null

!= hactivehwnd)

return s_ok;

} refguid guidprofile, hkl hkl, dword dwflags)

else

if (dwprofiletype & tf_profiletype_keyboardlayout)

else

return s_ok;

}

文字編輯框

在介面程式設計中,文字編輯框是使用頻率最高的控制項之一,為了方便操作,mfc提供了cedit類來管理文字編輯框。建立文字編譯框有兩種方式 第一種 在對話方塊模式下,編輯資源檔案,撰寫建立對話方塊的指令碼,可在表示對話方塊指令碼的一對識別符號begin和end中間插入形如 edittext idc m...

MFC文字編輯框

mfc文字編輯框裡面的2個屬性multiline和auto hscroll,先看vs給的說明 multiline 如果控制項文字對控制項寬度而言太長,測將文字折為多行。auto hscroll 當使用者在行尾鍵入字元時,自動是文字滾動到左側。先試試multiline true auto hscrol...

文字編輯框 調整文字編輯區域

在多行模式下的cedit類提供void cedit setrectnp lpcrect lprect 函式,此函式用來調整文字編輯的區域,用這個函式可以設定上下左右margins,而void setmargins uint nleft,uint nright 函式只能設定左右margins。crec...