IE plugins. Проблема с HasFocusIO(VOID)
От: techgl  
Дата: 12.03.06 17:51
Оценка:
Реализовал для своего расширения интерфейс IInputObject:


/////////////////////////////////////////////////////////////////////////////
// IInputObject methods implementation
/////////////////////////////////////////////////////////////////////////////
STDMETHODIMP CSimpleBand::UIActivateIO(BOOL fActivate, LPMSG lpMsg)
{
    if (fActivate)
    {
        m_wndToolBar.m_edSearch.SetFocus();
        FocusChange(TRUE);
    }

    return S_OK;
}

STDMETHODIMP CSimpleBand::HasFocusIO(VOID)
{
    if (m_wndToolBar.m_hWnd == ::GetFocus())
    {
        AfxMessageBox("Focus bar");
        return S_OK;
    }

    if (m_wndToolBar.m_edSearch.m_hWnd == ::GetFocus())
    {
        AfxMessageBox("Focus edit");
        return S_OK;
    }

    return S_FALSE;
}

STDMETHODIMP CSimpleBand::TranslateAcceleratorIO(LPMSG lpMsg)
{
    AfxMessageBox("Translate");
    if (lpMsg->wParam == VK_BACK)
    {
        AfxMessageBox("Backspace");
        return S_OK;
    }
    
    return S_FALSE;    
}

VOID CSimpleBand::FocusChange(BOOL bHaveFocus)
{
    if (m_pSite)
    {
        m_pSite->OnFocusChangeIS(
            static_cast<IInputObject*>(this), 
            bHaveFocus);        
    }
}

Однако, когда в IE нажимаешь Tab, то курсор на мгновение появляется в поле ввода, а потом исчезает. Если его туда установить мышкой, то не будут работать акселераторы (backspace, etc). Все делал по статьям, тема заезжена, но почему-то не получается. В TranslateIOAccelerator вообще управление не попадает, я так понимаю из-за того, что HasFocusIO не вернул S_OK, а не вернул он его, из-за того, что не нашел окна, которое сейчас имеет фокус.
Кто подскажет, в чем проблема?

Вот, на всякий случай, код создания поля поиска. Я унаследовал класс CComboBoxEx.
if (!m_edSearch.Create(
        WS_CHILD | WS_VISIBLE | WS_VSCROLL | CBS_HASSTRINGS,
        rc, 
        this, 
        IDC_ADDRESS_BOX)) return -1;
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.