TrackPopupMenu и получение/потеря фокуса

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

  1. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    В моем приложении в трее висит иконка, нажав правой кнопкой мыши на которую появляется меню с помощью функции TrackPopupMenu. Если не тыкать в это меню, а сразу ткнуть в какое-то другое место (таскбар, десктоп, другое окно), то мое меню не исчезает. Для сравнения - если ткнуть правой кнопкой на таскбар, то тоже появится popup menu, но оно исчезает при нажатии в любое другое место кроме этого меню.

    Потыркавшись, я обнаружил, что если после появления моего меню тыркнуть ему в сепаратор, то последующий тырк в любое место, кроме моего меню, это самое меню закроет. Логично предположить, что popup menu исчезает при потере фокуса, а в моем первом случае оно не исчезает потому что этот фокус просто не получает (а получает при тыкании в сепаратор). Если все оно так, то как заставить popup menu сразу получить фокус?
     
  2. RamMerLabs

    RamMerLabs Well-Known Member

    Публикаций:
    0
    Регистрация:
    11 сен 2006
    Сообщения:
    1.426
    SetForegroundWindow перед показом меню.

    Код (Text):
    1.     invoke GetCursorPos, addr pt
    2.     invoke SetForegroundWindow, hWnd
    3.     invoke TrackPopupMenu, hPopupMenu, TPM_RIGHTALIGN or TPM_LEFTBUTTON, pt.x, pt.y, 0, hWnd, 0
     
  3. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    RamMerLabs

    Работает! Спасибо! :)
     
  4. iZzz32

    iZzz32 Sergey Sfeli

    Публикаций:
    0
    Регистрация:
    3 сен 2006
    Сообщения:
    355
    В некоторых исходниках ещё видел PostMessage(hWnd, WM_NULL, 0, 0) после TrackPopupMenu. Никто не подскажет, зачем?
     
  5. iZzz32

    iZzz32 Sergey Sfeli

    Публикаций:
    0
    Регистрация:
    3 сен 2006
    Сообщения:
    355
  6. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    Еще вот вопрос... У меня визуального окна приложения нет, а меню нужно парентовое окно. Поэтому я создаю невидимое окно 1х1 со стилем WS_POPUP. Доктор, это нормально?
     
  7. RamMerLabs

    RamMerLabs Well-Known Member

    Публикаций:
    0
    Регистрация:
    11 сен 2006
    Сообщения:
    1.426
    _DEN_
    а в чём собственно проблема?

    Код (Text):
    1. invoke GetModuleHandle, 0
    2. mov edi, eax
    3. mov hInst, eax
    4. mov wc.cbSize, sizeof WNDCLASSEX
    5. mov wc.style, 0
    6. mov wc.lpfnWndProc, offset WndProc
    7. mov wc.cbClsExtra, 0
    8. mov wc.cbWndExtra, 0
    9. mov wc.hInstance, edi
    10. mov wc.hbrBackground, 0
    11. mov wc.lpszMenuName, 0
    12. mov wc.lpszClassName, offset ClassName
    13. mov wc.hIcon, 0
    14. mov wc.hIconSm, 0
    15. mov wc.hCursor, 0
    16. invoke RegisterClassEx, addr wc
    17. invoke CreateWindowEx, 0, addr ClassName, 0, 0, 0, 0, 0, 0, 0, 0, edi, 0
    18. .while TRUE
    19.  invoke GetMessage, addr msg,0,0,0
    20.  .BREAK .IF (!eax)
    21.  invoke TranslateMessage, addr msg
    22.  invoke DispatchMessage, addr msg
    23. .endw
    24. mov eax, msg.wParam
    25. invoke ExitProcess,eax
    зарегили класс, создали окно, пустили обработку очереди

    Код (Text):
    1. WndProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM
    2. ;...
    3.  .if uMsg == WM_SHELLNOTIFY
    4.   .if wParam == IDI_TRAY
    5.    .if lParam == WM_RBUTTONDOWN
    6.     invoke GetCursorPos, addr pt
    7.     invoke SetForegroundWindow, hWnd
    8.     invoke TrackPopupMenu, hPopupMenu, TPM_RIGHTALIGN or TPM_LEFTBUTTON, pt.x, pt.y, 0, hWnd, 0
    9.    .endif
    10.    .if lParam == WM_LBUTTONDOWN
    11.     .if !dwCreated
    12.      invoke DialogBoxParam, 0, 10, hWnd, addr DlgProc, 5
    13.     .endif
    14.    .endif
    15.   .endif
    16.  .else
    17.   invoke DefWindowProc, hWnd, uMsg, wParam, lParam
    18.   ret
    19.  .endif
    20.  xor eax,eax
    21.  ret
    22. WndProc endp
    и знай себе только сообщения обрабатывай:)
     
  8. RamMerLabs

    RamMerLabs Well-Known Member

    Публикаций:
    0
    Регистрация:
    11 сен 2006
    Сообщения:
    1.426
    ой, тут немного лишнего (не относящегося к делу) в коде - вывернул с первого попавшегося на винте сорса... хренова без редактирования...
    думаю, смысл понятен.
     
  9. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    RamMerLabs

    Окно без стилей и, главное, 0х0 - это нормально? Везде будет работать без сюрпризов?
     
  10. RamMerLabs

    RamMerLabs Well-Known Member

    Публикаций:
    0
    Регистрация:
    11 сен 2006
    Сообщения:
    1.426
    _DEN_
    насчёт "везде" сказать не могу, до висты сп1 работает точно. хотя подводных камней быть не должно.