Окно «прозрачно» для мыши

Тема в разделе "WASM.WIN32", создана пользователем pluton, 20 мар 2007.

  1. pluton

    pluton New Member

    Публикаций:
    0
    Регистрация:
    8 фев 2007
    Сообщения:
    66
    Адрес:
    Odessa
    Привет!
    Название темы, наверное, выглядит странно, но такая штуковина в винде есть. Суть дела: есть программа ClockX, в которой есть опция, которая делает окно прозрачным для мыши - то есть окно висит поверх всех, но при клацании по нём мышей, оно не реагирует, а реагируют окна, которые под этим окном. Кто-нибудь знает как это включить (если это стандартная фишка винды)?
    Насчёт поиска по форуму - я даже не знаю как эта штуковина называется.
    Спасибо всем.
     
  2. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    просто пересылать все мышиные сообщения низлежащему окну.. всякие WM_MOUSEMOVE и проч

    а еще есть такая фишка, как прозрачность окна... хотя я не помню что происходит в реакцией мыши на него.
     
  3. nobodyzzz

    nobodyzzz New Member

    Публикаций:
    0
    Регистрация:
    13 июл 2005
    Сообщения:
    475
    хм...
    в обработчике WM_LBUTTONDBLCLK узнавать окно, которое лежит под твоим и пересылать ему это сообщение
     
  4. pluton

    pluton New Member

    Публикаций:
    0
    Регистрация:
    8 фев 2007
    Сообщения:
    66
    Адрес:
    Odessa
    я думал этот вариант. а как узнать окна, находящиеся под моим?
     
  5. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    pluton
    Есть такая штука, как Z-order. Почитай MSDN )
    Для узнавания окна под твоим - GetWindow( hWnd, GW_HWNDNEXT );
     
  6. pluton

    pluton New Member

    Публикаций:
    0
    Регистрация:
    8 фев 2007
    Сообщения:
    66
    Адрес:
    Odessa
    это хорошо. но, как я понял, этот з-ордер - глобальный?
    а мне надо под моим окном. если перебирать все окна после моего, может быть долго
     
  7. Nouzui

    Nouzui New Member

    Публикаций:
    0
    Регистрация:
    17 ноя 2006
    Сообщения:
    856
    GetWindowFromPoint или что-то вроде того...
     
  8. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    WindowFromPoint. Только это не то. Придется скрыть текущее окно - раз. Сообщения получаются довольно часто, окно будет "мигать".
    два - получим хендл окна дочернего, а не главного. (например для Visual Studio - хендл текстового поля, а не главного окна)
     
  9. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    под твоим окном - GetWindow( hYourWindow, GW_HWNDNEXT), я же написал
     
  10. Nouzui

    Nouzui New Member

    Публикаций:
    0
    Регистрация:
    17 ноя 2006
    Сообщения:
    856
    это вернет следующее в зордере, а не геометрически. Представь, что под твоим окошком лежат два других - одно справа, другое слева. И получить нужно именно то, над которым мышь

    а разве при клике мышью на едитбоксе мессагу получет не едитбокс, а его родитель?
     
  11. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    эм.. ну вообщем да ) туплю чето.
     
  12. Freeman

    Freeman New Member

    Публикаций:
    0
    Регистрация:
    10 фев 2005
    Сообщения:
    1.385
    Адрес:
    Ukraine
    эммм ну а чото типа GetWindowRect окна, полученного по GetWindow( hYourWindow, GW_HWNDNEXT) и смотреть, попала ли мышь на него...
     
  13. Nouzui

    Nouzui New Member

    Публикаций:
    0
    Регистрация:
    17 ноя 2006
    Сообщения:
    856
    можно не скрывать, а просто дисайблить, мерцать по крайней мере не будет
    смущает только, что если под ним тоже может оказаться запрещенное окно..
     
  14. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    тогда энаблить все окна кроме своего :)))
     
  15. Nouzui

    Nouzui New Member

    Публикаций:
    0
    Регистрация:
    17 ноя 2006
    Сообщения:
    856
    кстати, вопрос возник..
    а как же тода вообще получить окно по определенным координатам? раньше думал, что как раз WindowFromPoint, но тут выяснились, какие у нее особенности..
     
  16. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Nouzui
    EnumWindows / GetWindowRect + проверка координат
     
  17. Nouzui

    Nouzui New Member

    Публикаций:
    0
    Регистрация:
    17 ноя 2006
    Сообщения:
    856
    ага..
     
  18. kero

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

    Публикаций:
    0
    Регистрация:
    4 апр 2006
    Сообщения:
    1.074
    Адрес:
    Москва
    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 есть "неточности").
     
  19. pluton

    pluton New Member

    Публикаций:
    0
    Регистрация:
    8 фев 2007
    Сообщения:
    66
    Адрес:
    Odessa
    БОЛЬШОЕ СПАСИБО всем, особенно kero

    Установка WS_EX_TOPMOST почему-то не работает, поэтому необходимо установить окно поверх всех с помощью SetWindowPos.
    Вот работающий код, если кому надо:
    Код (Text):
    1.     invoke GetWindowLong, hWnd, GWL_EXSTYLE
    2.     or eax, WS_EX_TRANSPARENT + WS_EX_LAYERED
    3.     invoke SetWindowLong, hWnd, GWL_EXSTYLE, eax
    4.     invoke SetLayeredWindowAttributes, hWnd, 0, 255, LWA_ALPHA
    5.     invoke SetWindowPos, hWnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE + SWP_NOSIZE
     
  20. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    Попробуй заменить + на or, скорее всего дело в этом - плюс далеко не всегда равноценный заменитель or :)