输入法信息捕获总结

    输入法信息捕获相关的消息有WM_IME_SETCONTEXT、WM_IME_SELECT和WM_IME_NOTIFY。WM_IME_SETCONTEXT为文本框激活后输入法上下文激活的消息,WM_IME_SELECT为输入法改变的消息,WM_IME_NOTIFY为输入法相关通知消息,根据wParam区分不同的消息,其中IMN_OPENCANDIDATE为候选项打开,IMN_CHANGECANDIDATE为候选项改变,IMN_CLOSECANDIDATE为候选项关闭。
    通过Hook GetMessage只能Hook到WM_IME_NOTIFY中的上述三个消息,它的其他消息以及WM_IME_SETCONTEXT和WM_IME_SELECT都捕获不到。因此建议使用Hook CallWnd。每个消息系统都会发送两次,一个是当前输入法发送的,一个是默认输入法发送的。因此,可以通过ImmGetDefaultIMEWnd(GetFocus())获取默认输入法句柄,然后将它的消息都忽略。当前文本窗体需要通过GetFocus()获取,::ImmGetDescriptionA(::GetKeyboardLayout(GetCurrentThreadId())可以获取当前输入法的描述信息。ImmGetContext获取输入法上下文,当前的线程上下文必须是窗体创建上下文,使用完后需要用ImmReleaseContext释放上下文句柄。ImmGetCandidateListCount可以获取所有的候选项,获取的内容保存在CANDIDATELIST结构中。这个结构的dwCount表示候选项的总个数,dwPageSize表示每页大小,dwSelection表示当前候选项。

你可能感兴趣的:(输入法信息捕获总结)