Привет! Название темы, наверное, выглядит странно, но такая штуковина в винде есть. Суть дела: есть программа ClockX, в которой есть опция, которая делает окно прозрачным для мыши - то есть окно висит поверх всех, но при клацании по нём мышей, оно не реагирует, а реагируют окна, которые под этим окном. Кто-нибудь знает как это включить (если это стандартная фишка винды)? Насчёт поиска по форуму - я даже не знаю как эта штуковина называется. Спасибо всем.
просто пересылать все мышиные сообщения низлежащему окну.. всякие WM_MOUSEMOVE и проч а еще есть такая фишка, как прозрачность окна... хотя я не помню что происходит в реакцией мыши на него.
хм... в обработчике WM_LBUTTONDBLCLK узнавать окно, которое лежит под твоим и пересылать ему это сообщение
pluton Есть такая штука, как Z-order. Почитай MSDN ) Для узнавания окна под твоим - GetWindow( hWnd, GW_HWNDNEXT );
это хорошо. но, как я понял, этот з-ордер - глобальный? а мне надо под моим окном. если перебирать все окна после моего, может быть долго
WindowFromPoint. Только это не то. Придется скрыть текущее окно - раз. Сообщения получаются довольно часто, окно будет "мигать". два - получим хендл окна дочернего, а не главного. (например для Visual Studio - хендл текстового поля, а не главного окна)
это вернет следующее в зордере, а не геометрически. Представь, что под твоим окошком лежат два других - одно справа, другое слева. И получить нужно именно то, над которым мышь а разве при клике мышью на едитбоксе мессагу получет не едитбокс, а его родитель?
эммм ну а чото типа GetWindowRect окна, полученного по GetWindow( hYourWindow, GW_HWNDNEXT) и смотреть, попала ли мышь на него...
можно не скрывать, а просто дисайблить, мерцать по крайней мере не будет смущает только, что если под ним тоже может оказаться запрещенное окно..
кстати, вопрос возник.. а как же тода вообще получить окно по определенным координатам? раньше думал, что как раз WindowFromPoint, но тут выяснились, какие у нее особенности..
pluton Для Win>=2k решение тривиально: окну ClockX установить WS_EX_TOPMOST + WS_EX_TRANSPARENT + WS_EX_LAYERED + SetLayeredWindowAttributes/LWA_ALPHA. P.S. В данном случае поиск нижележащих окон уводит не в ту степь. Но поскольку выявилась определенная путаница - есть смысл почитать в MSDN про WindowFromPoint, ChildWindowFromPoint, ChildWindowFromPointEx, RealChildWindowFromPoint, GetWindowRgn, PtInRegion. Впрочем, читать нужно критически, т.е. не лениться проверять (к примеру, в MSDN-овской инфе по WindowFromPoint есть "неточности").
БОЛЬШОЕ СПАСИБО всем, особенно kero Установка WS_EX_TOPMOST почему-то не работает, поэтому необходимо установить окно поверх всех с помощью SetWindowPos. Вот работающий код, если кому надо: Код (Text): invoke GetWindowLong, hWnd, GWL_EXSTYLE or eax, WS_EX_TRANSPARENT + WS_EX_LAYERED invoke SetWindowLong, hWnd, GWL_EXSTYLE, eax invoke SetLayeredWindowAttributes, hWnd, 0, 255, LWA_ALPHA invoke SetWindowPos, hWnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE + SWP_NOSIZE
Попробуй заменить + на or, скорее всего дело в этом - плюс далеко не всегда равноценный заменитель or