В настоящее время я занимаюсь разработкой программы VSTO Word Add-In. И я должен захватить сообщения IME, чтобы контролировать состояние ввода. Есть два сообщения, которые я пытаюсь уловить здесь:
1, IMC_OPENSTATUSWINDOW (когда бар кандидатов открывается) 2, IMC_CLOSESTATUSWINDOW (когда бар кандидатов закрывается).
Ниже приведен код, который я использую. Он отлично работает практически в любых приложениях (например, winform, wpf или notepad ++, потому что я здесь использую глобальный хук), однако, когда я использую этот код в приложениях надстроек Vsto Word, сообщение IMC_CLOSESTATUSWINDOW никогда не может быть захвачено. У любого есть какие-либо идеи, или любая подсказка будет оценена.
int CandidateBarOpen = 0;
LRESULT CALLBACK HookshurufaProcess(int nCode, WPARAM wParam, LPARAM lParam)
{
//win10
PMSG pmsg = (PMSG)lParam;
if (pmsg->message == WM_IME_NOTIFY){
if (pmsg->wParam& IMC_CLOSESTATUSWINDOW){
CandidateBarOpen = 1;
}
else if (pmsg->wParam& IMC_OPENSTATUSWINDOW){
CandidateBarOpen = 0;
}
}
return TRUE;
}
Документы Microsoft ясно об этом ( https://msdn.microsoft.com/en-us/library/windows/desktop/dd374139(v=vs.85).aspx ). Вы должны использоватьIMN_OPENSTATUSWINDOW
а также IMN_CLOSESTATUSWINDOW
параметры с WM_IME_NOTIFY
не IMC_OPENSTATUSWINDOW
а также IMC_CLOSESTATUSWINDOW
,
Последние две команды должны использоваться с WM_IME_CONTROL
,
Других решений пока нет …