Отловить момент ухода курсора с окна

Тема в разделе "WASM.WIN32", создана пользователем CodeGrinder, 11 янв 2009.

  1. CodeGrinder

    CodeGrinder New Member

    Публикаций:
    0
    Регистрация:
    9 фев 2007
    Сообщения:
    56
    Нужно отловить момент, когда мышь выходит за пределы контрола (кнопки, картинки). Есть что-то похожее на WM_MOUSEMOVE, но с обратным эффектом?))

    Заранее спасибо!
     
  2. perez

    perez Member

    Публикаций:
    0
    Регистрация:
    25 апр 2005
    Сообщения:
    502
    Адрес:
    Moscow city
    Используй SetCapture (кажется так).
    Потом проверяй координаты в обработчике WM_MOUSEMOVE, когда мышь уйдет за пределы, вызови ReleaseCapture, чтобы освободить мышь.


    http://msdn.microsoft.com/en-us/library/ms646262.aspx
     
  3. CodeGrinder

    CodeGrinder New Member

    Публикаций:
    0
    Регистрация:
    9 фев 2007
    Сообщения:
    56
    Спасибо, но я думал есть вариант без проверки координат..(
     
  4. _basmp_

    _basmp_ New Member

    Публикаций:
    0
    Регистрация:
    10 июл 2005
    Сообщения:
    2.939
    WM_mouseleave
    пишу по памяти. щас нет возможности уточнить. Посылается если запрошено. Погуглите или подождите пока у меня немного нормализуется.
     
  5. perez

    perez Member

    Публикаций:
    0
    Регистрация:
    25 апр 2005
    Сообщения:
    502
    Адрес:
    Moscow city
  6. CodeGrinder

    CodeGrinder New Member

    Публикаций:
    0
    Регистрация:
    9 фев 2007
    Сообщения:
    56
    У меня TrackMouseEvent почему-то посылает WM_MOUSELEAVE когда мышь находится на окне, а не наоборот..
     
  7. _basmp_

    _basmp_ New Member

    Публикаций:
    0
    Регистрация:
    10 июл 2005
    Сообщения:
    2.939
    CodeGrinder
    помню тоже не сразу все заработало, но подробностей щас не будет. Позже, если не решите сами. просто пробуйте. словили маусемове, сразу запрашиваем на мауселеаве. Както так. Точнее - потом.
     
  8. Sol_Ksacap

    Sol_Ksacap Миша

    Публикаций:
    0
    Регистрация:
    6 мар 2008
    Сообщения:
    623
    Странно. Должно быть что-то вроде:

    Код (Text):
    1. WndProc(HWND hwnd, UINT mesg)
    2. {
    3.     static bool CursorIn = false;
    4.  
    5.     switch (mesg)
    6.     {
    7.     case WM_MOUSEMOVE:
    8.         if (!CursorIn)
    9.         {
    10.             dbg << "Cursor entered WindowArea";
    11.             TRACKMOUSEEVENT tme = {sizeof(tme), TME_LEAVE, hwnd, 0};
    12.             TrackMouseEvent(&tme);      // we need this to get WM_MOUSELEAVE notifications
    13.             CursorIn = true;
    14.         }
    15.         break;
    16.     case WM_MOUSELEAVE:
    17.         dbg << "Cursor left WindowArea";
    18.         CursorIn = false;
    19.         break;
    20.     }
    21. }
     
  9. Pavia

    Pavia Well-Known Member

    Публикаций:
    0
    Регистрация:
    17 июн 2003
    Сообщения:
    2.409
    Адрес:
    Fryazino
    Я использовал в свое время WM_NCHITTEST
     
  10. kero

    kero Модератор SOURCES & 2LZ Команда форума

    Публикаций:
    0
    Регистрация:
    4 апр 2006
    Сообщения:
    1.074
    Адрес:
    Москва
    Pavia
    И как же использовали WM_NCHITTEST в ваше время?
     
  11. perez

    perez Member

    Публикаций:
    0
    Регистрация:
    25 апр 2005
    Сообщения:
    502
    Адрес:
    Moscow city
    kero
    Как я понял, использовался метод, который я предлагал в самом начале, только вместо проверок координат по WM_MOUSEMOVE положение курсора
    проверялось по WM_NCHITTEST.

    http://msdn.microsoft.com/en-us/library/ms645618(VS.85).aspx
     
  12. kero

    kero Модератор SOURCES & 2LZ Команда форума

    Публикаций:
    0
    Регистрация:
    4 апр 2006
    Сообщения:
    1.074
    Адрес:
    Москва
    perez, что такое WM_NCHITTEST - я в курсе :) , меня другое интересовало...

    Вот представьте, к примеру, что окно-родитель контролов - задизаблено.
    Сработает тогда хоть один из предложенных выше способов?
     
  13. _basmp_

    _basmp_ New Member

    Публикаций:
    0
    Регистрация:
    10 июл 2005
    Сообщения:
    2.939
    kero
    текущие скрин координаты мышки вы всегда можете поиметь из мессаж лупа.
     
  14. perez

    perez Member

    Публикаций:
    0
    Регистрация:
    25 апр 2005
    Сообщения:
    502
    Адрес:
    Moscow city
    >> Спасибо, но я думал есть вариант без проверки координат..(

    Вот еще способ без проверки координат ))
    Сабклассим контрол, вот ф-я обработки сообщений (на сях):

    Код (Text):
    1. LRESULT CALLBACK SubclassProc(HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam)
    2. {
    3.     switch(iMsg)
    4.     {
    5.         case WM_MOUSEMOVE:
    6.             {
    7.                 POINT pt;
    8.                 pt.x = (LONG) MAKEPOINTS(lParam).x;
    9.                 pt.y = (LONG) MAKEPOINTS(lParam).y;
    10.                 ClientToScreen(hwnd, &pt);
    11.  
    12.                 HWND hWndUnderCursor = WindowFromPoint(pt);
    13.  
    14.                 if(hWndUnderCursor == hwnd && GetCapture() != hwnd)
    15.                 {
    16.                     SetCapture(hwnd);
    17.                 }
    18.                
    19.                 if(hWndUnderCursor != hwnd)
    20.                 {
    21.                     ReleaseCapture();
    22.                     MessageBox(hwnd, "Mouse left the button!", "", MB_OK);
    23.                 }
    24.                
    25.                 char str[256];
    26.                 wsprintf(str, "%d - %d (%d)", MAKEPOINTS(lParam).x, MAKEPOINTS(lParam).y, hWndUnderCursor == hwnd);
    27.                 SetWindowText(GetParent(hwnd), str);
    28.             }
    29.             break;
    30.     }
    31.     return CallWindowProc(OldWndProc, hwnd, iMsg, wParam, lParam);
    32. }
    Вот поект VC7.1 с работающей прогой http://webfile.ru/2548315.
     
  15. kero

    kero Модератор SOURCES & 2LZ Команда форума

    Публикаций:
    0
    Регистрация:
    4 апр 2006
    Сообщения:
    1.074
    Адрес:
    Москва
    _basmp_
    Что значит "всегда"? процедурку-то какую мыслите?
     
  16. _basmp_

    _basmp_ New Member

    Публикаций:
    0
    Регистрация:
    10 июл 2005
    Сообщения:
    2.939
    kero
    в мессаж лупе после GetMessage в поле MSG.pt
    или в любом месте GetMessagePos
    ну а процедурка.. Можно что нибудь вроде EnumThreadWindows или еще как. Вопрос фантазии.
     
  17. kero

    kero Модератор SOURCES & 2LZ Команда форума

    Публикаций:
    0
    Регистрация:
    4 апр 2006
    Сообщения:
    1.074
    Адрес:
    Москва
    _basmp_

    Считайте, что окно-родитель - DialogBox или MessageBox :)

    Ну как же "в любом"? Требуется ведь автоматическая реакция на уход курсора с контрола, вопрос о процедурке - именно об этом.
     
  18. _basmp_

    _basmp_ New Member

    Публикаций:
    0
    Регистрация:
    10 июл 2005
    Сообщения:
    2.939
    kero
    дополнительный поток с SetWindowsHookEx в нем.
    чтоб начинать чтото писать нужна гораздо менее размазаная и более окончательная инфа/задача. квны в проганьи плохо заканчиваются. Для 90% случаев варианты уже приведены выше.
     
  19. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    CodeGrinder
    А в чём собственно проблема проверки координат? в смысле хочется чтобы win за тебя эту проверку делала? а какая разница кто её делает ты или win? или хочется 3-5 строк программы сэкономить? так всё равно их потратишь пока будешь объяснять win чего же ты хочешь :))

    kero
    тогда не только выход мыши из контрола а и вход в контрол тоже под вопросом ;)
     
  20. AsmGuru62

    AsmGuru62 Member

    Публикаций:
    0
    Регистрация:
    12 сен 2002
    Сообщения:
    689
    Адрес:
    Toronto
    Сообщения мыши не придут на HWND, если хэндл disabled.