Добрый день.
Столкнулся вот с такой проблемой : повесил хук на события мыши, все получилось, сообщения получал, но появился побочный эффект — при выделении элементов CListrCtrl происходит зависание.
Подскажите где проблему искать?
Заранее благодарен.
Здравствуйте, Нахлобуч, Вы писали:
Н>Здравствуйте, Roman.Egorishev, Вы писали:
RE>>Непонятный факт, что при смене фокуса — зависание пропадает.
Н>Давайте код тады.
Краткий экскурс в историю.
Вообще задача стояла в отображении подсказок в немодальном диалоге, рождающимся с dll. Приложение представляет собой Add-in для Microsoft Office. Появлялась немодальная панель, на которой несколько закладок с диалогами. вот и нужно было отображать подсказки для компонент на этих дилогах. Сегодня ушел от хуков через перенаправление сообщений в CToolTipCtrl из WindowsProc.
Но хотелось бы понять, что было не так в моем хуке.
Итак, код для обработки мышиных сообщений представлял собой такое:
// Hook procedure for WH_GETMESSAGE hook type.
LRESULT CALLBACK GetMessageProc(int nCode, WPARAM wParam, LPARAM lParam)
{
// Switch the module state for the correct handle to be used.
AFX_MANAGE_STATE(AfxGetStaticModuleState( ));
// If this is a keystrokes message, translate it in controls'
// PreTranslateMessage().
LPMSG lpMsg = (LPMSG) lParam;
if( (nCode >= 0) &&
PM_REMOVE == wParam &&
(lpMsg->message >= WM_MOUSEFIRST && lpMsg->message <= WM_MOUSELAST) &&
AfxGetApp()->PreTranslateMessage((LPMSG)lParam) )
{
// The value returned from this hookproc is ignored, and it cannot
// be used to tell Windows the message has been handled. To avoid
// further processing, convert the message to WM_NULL before
// returning.
lpMsg->message = WM_NULL;
lpMsg->lParam = 0L;
lpMsg->wParam = 0;
}
// Passes the hook information to the next hook procedure in
// the current hook chain.
return ::CallNextHookEx(hHook, nCode, wParam, lParam);
}
BOOL CDlgDataSources::OnInitDialog()
{
CDialog::OnInitDialog();
// Install the WH_GETMESSAGE hook function.
hHook = ::SetWindowsHookEx(
WH_GETMESSAGE,
GetMessageProc,
AfxGetInstanceHandle(),
GetCurrentThreadId());
ASSERT (hHook);
return TRUE;
}
BOOL CDlgDataSources::PreTranslateMessage(MSG* pMsg)
{
m_ToolTip->RelayEvent( pMsg );
return CDialog::PreTranslateMessage(pMsg);
}
При сужении диапазона сообщений до WM_MOUSEMOVE — зависание при нажатии на item'е CListCtrl'а прпало, но соотв пропали и остальные возможности — drag-and-drop и т.д.
Особый интерес для меня представляю выделенные строки кода, возможно изначально в них проблема...