Как получить уведомление, когда встроенный элемент управления ActiveX получает и теряет фокус клавиатуры?

У меня есть небольшое приложение на основе диалога C ++ / MFC со встроенным элементом управления ActiveX Internet Explorer. Я хочу знать, когда этот встроенный элемент управления получает и теряет фокус клавиатуры. Я думал сделать это:

BOOL CWinAppDerivedClass::PreTranslateMessage(MSG* pMsg)
{
if(pMsg->message == WM_SETFOCUS)
{
//if(checkIEWindow(pMsg->hwnd))
{
//Process it
}
}

return CWinApp::PreTranslateMessage(pMsg);
}

но независимо от того, что я делаю, WM_SETFOCUS, похоже, вообще не отправляется.

есть идеи как это сделать?

0

Решение

Один из способов сделать это — использовать весь процесс оконная процедура крюк.

Сначала вам нужно установить хук где-то из основного потока вашего графического приложения. В случае диалогового окна MFC хорошим местоположением является OnInitDialog обработчик уведомлений:

//hHook is "this" class member variable, declared as HHOOK. Set it to NULL initially.
hHook = ::SetWindowsHookEx(WH_CALLWNDPROC, CallWndProcHook, AfxGetInstanceHandle(), ::GetCurrentThreadId());

Тогда процедура подключения может быть настроена так:

static LRESULT CALLBACK CallWndProcHook(int nCode, WPARAM wParam, LPARAM lParam)
{
if (nCode == HC_ACTION)
{
CWPSTRUCT* pCWS = (CWPSTRUCT*)lParam;

//Check if this is the message we need
if(pCWS->message == WM_SETFOCUS ||
pCWS->message == WM_KILLFOCUS)
{
//Check if this is the window we need
if(pCWS->hwnd == hRequiredWnd)
{
//Process your message here
}
}
}

return ::CallNextHookEx(NULL, nCode, wParam, lParam);
}

Также не забудьте отцепить. Хорошее место для этого PostNcDestroy обработчик:

if(hHook != NULL)
{
::UnhookWindowsHookEx(hHook);
hHook = NULL;
}
1

Другие решения