ITfContext::RequestEditSession


官方文档: https://learn.microsoft.com/zh-cn/windows/win32/api/msctf/nf-msctf-itfcontext-requesteditsession

套娃开始:

当键盘事件被触发时,获得的参数是ITfContext。但是ITfContext并不能直接修改内容添加文字等,

需要调用 RequestEditSession,传入一个 ITfEditSession 才能实现内容的修改。


RequestEditSession是什么?

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 线程。

ITfEditSession是什么?

点击查看