В моем приложении в трее висит иконка, нажав правой кнопкой мыши на которую появляется меню с помощью функции TrackPopupMenu. Если не тыкать в это меню, а сразу ткнуть в какое-то другое место (таскбар, десктоп, другое окно), то мое меню не исчезает. Для сравнения - если ткнуть правой кнопкой на таскбар, то тоже появится popup menu, но оно исчезает при нажатии в любое другое место кроме этого меню. Потыркавшись, я обнаружил, что если после появления моего меню тыркнуть ему в сепаратор, то последующий тырк в любое место, кроме моего меню, это самое меню закроет. Логично предположить, что popup menu исчезает при потере фокуса, а в моем первом случае оно не исчезает потому что этот фокус просто не получает (а получает при тыкании в сепаратор). Если все оно так, то как заставить popup menu сразу получить фокус?
SetForegroundWindow перед показом меню. Код (Text): invoke GetCursorPos, addr pt invoke SetForegroundWindow, hWnd invoke TrackPopupMenu, hPopupMenu, TPM_RIGHTALIGN or TPM_LEFTBUTTON, pt.x, pt.y, 0, hWnd, 0
В некоторых исходниках ещё видел PostMessage(hWnd, WM_NULL, 0, 0) после TrackPopupMenu. Никто не подскажет, зачем?
Еще вот вопрос... У меня визуального окна приложения нет, а меню нужно парентовое окно. Поэтому я создаю невидимое окно 1х1 со стилем WS_POPUP. Доктор, это нормально?
_DEN_ а в чём собственно проблема? Код (Text): invoke GetModuleHandle, 0 mov edi, eax mov hInst, eax mov wc.cbSize, sizeof WNDCLASSEX mov wc.style, 0 mov wc.lpfnWndProc, offset WndProc mov wc.cbClsExtra, 0 mov wc.cbWndExtra, 0 mov wc.hInstance, edi mov wc.hbrBackground, 0 mov wc.lpszMenuName, 0 mov wc.lpszClassName, offset ClassName mov wc.hIcon, 0 mov wc.hIconSm, 0 mov wc.hCursor, 0 invoke RegisterClassEx, addr wc invoke CreateWindowEx, 0, addr ClassName, 0, 0, 0, 0, 0, 0, 0, 0, edi, 0 .while TRUE invoke GetMessage, addr msg,0,0,0 .BREAK .IF (!eax) invoke TranslateMessage, addr msg invoke DispatchMessage, addr msg .endw mov eax, msg.wParam invoke ExitProcess,eax зарегили класс, создали окно, пустили обработку очереди Код (Text): WndProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM ;... .if uMsg == WM_SHELLNOTIFY .if wParam == IDI_TRAY .if lParam == WM_RBUTTONDOWN invoke GetCursorPos, addr pt invoke SetForegroundWindow, hWnd invoke TrackPopupMenu, hPopupMenu, TPM_RIGHTALIGN or TPM_LEFTBUTTON, pt.x, pt.y, 0, hWnd, 0 .endif .if lParam == WM_LBUTTONDOWN .if !dwCreated invoke DialogBoxParam, 0, 10, hWnd, addr DlgProc, 5 .endif .endif .endif .else invoke DefWindowProc, hWnd, uMsg, wParam, lParam ret .endif xor eax,eax ret WndProc endp и знай себе только сообщения обрабатывай
ой, тут немного лишнего (не относящегося к делу) в коде - вывернул с первого попавшегося на винте сорса... хренова без редактирования... думаю, смысл понятен.
_DEN_ насчёт "везде" сказать не могу, до висты сп1 работает точно. хотя подводных камней быть не должно.