Реализовал для своего расширения интерфейс 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;