官方文档: https://learn.microsoft.com/zh-cn/windows/win32/api/msctf/nf-msctf-itfcontext-requesteditsession
当键盘事件被触发时,获得的参数是ITfContext。但是ITfContext并不能直接修改内容添加文字等,
需要调用 RequestEditSession,传入一个 ITfEditSession 才能实现内容的修改。
ITfContext::RequestEditSession 获取访问权限 实际上是为了获取一个用于执行编辑会话的 ITfEditSession 接口的指针
通常后面紧跟 (参数二)pEditSession->Release(); 因为他会自动调用
ITfEditSession::DoEditSession 或者 CStartCompositionEditSession::DoEditSession
源码中搜索 pContext->RequestEditSession 查看例子
HRESULT RequestEditSession( [in] TfClientId tid, //包含一个 TfClientId 值,该值标识要与之建立编辑会话的客户端。 [in] ITfEditSession *pes, //指向调用用于执行编辑会话的 ITfEditSession 接口的指针。 [in] DWORD dwFlags, //一个请求权限的常量 一般为 读写权限 TF_ES_SYNC | TF_ES_READWRITE [out] HRESULT *phrSession );
RequestEditSession 之后,ITfEditSession::DoEditSession 会被(迅速)调用,可以在这个时候实现对内容的修改,也可以干别的事情。比如创建或者结束 一个ITfComposition。
为什么这么设计,我猜测是从线程管理的角度。被输入的应用程序不可能锁住UI线程等待输入,但是多线程同时修改,可能会产生线程同步问题。操作系统可能会在你触发 RequestEditSession 的时候迅速锁住 UI 线程,输入,然后释放 UI 线程。