Как получать уведомления, когда встроенный элемент управления 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, похоже, вообще не отправляется.

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


person c00000fd    schedule 02.05.2014    source источник


Ответы (1)


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

Сначала вам нужно установить хук где-нибудь из основного потока вашего приложения с графическим интерфейсом. В случае диалогового окна 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;
}
person ahmd0    schedule 03.05.2014