Состояние парентового окна через хендл дочернего

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

  1. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    Есть некое окно, где-то внутри него есть child-окно. Есть хендл этого child окна.

    Как по-простому узнать, видно ли сейчас это child-окно? Есть ли более простой способ, чем идти вверх по цепочке овнеров через GetWindow и проверять состояние самого верхнего не-child окна?
     
  2. x0man

    x0man New Member

    Публикаций:
    0
    Регистрация:
    23 мар 2008
    Сообщения:
    358
    Код (Text):
    1. BOOL IsWindowVisible(
    2.     HWND hWnd   // handle of window
    3.    );
    Оо ???
     
  3. _DEN_

    _DEN_ DEN

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

    Да вот в том-то и дело, что для чайлдового окна IsWindowVisible говорит что окно видимо, даже когда основное окно свернуто.
     
  4. x0man

    x0man New Member

    Публикаций:
    0
    Регистрация:
    23 мар 2008
    Сообщения:
    358
    код покажте...
     
  5. _DEN_

    _DEN_ DEN

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

    Суть проблемы: Direct3D device не создается, если паретновое окно свернуто. Поэтому перед созданием я проверяю.

    Код (Text):
    1. bool xxxxxx::active(HWND wnd)
    2. {
    3.     if(!IsWindowVisible(wnd))
    4.     {
    5.         log_message(log::debug, "Direct3D window is not visible");
    6.         return false;
    7.     }
    8.     else
    9.     {
    10.         log_message(log::debug, "Direct3D window is visible");
    11.     }
    12.  
    13.     WINDOWPLACEMENT wp = {0};
    14.     wp.length = sizeof(wp);
    15.     GetWindowPlacement(wnd, &wp);
    16.     return wp.showCmd == SW_SHOW || wp.showCmd == SW_SHOWNORMAL;
    17. }
    Но оба способа не детектят ситуацию когда все свернуто. Еще пробовал GetWindowInfo и проверял статус - тоже мимо.
     
  6. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    Ну и да, по логам я вижу что IsWindowsVisible возвращает TRUE. Тест кейс - запускаю приложение, нажимаю Windows+D, получаю баг.
     
  7. x0man

    x0man New Member

    Публикаций:
    0
    Регистрация:
    23 мар 2008
    Сообщения:
    358
    Парадокс :)
     
  8. _DEN_

    _DEN_ DEN

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

    Как выяснилось, все еще жосче чем я думал :) Мое нативное окно шлепается на WPF-ное окно, которое в свою очередь складывается (омг) в невидимый контейнер.
     
  9. x0man

    x0man New Member

    Публикаций:
    0
    Регистрация:
    23 мар 2008
    Сообщения:
    358
    холи крап...импасибл)))
     
  10. kero

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

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

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    _DEN_
    WM_ACTIVATE не пробовал обрабатывать?
     
  12. kero

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

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

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    kero
    Ты против?
     
  14. kero

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

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

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    kero
    Делать нечего, уже напробовался.
     
  16. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    А вот и не подеретесь!
     
  17. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    _DEN_
    Я хотел не отвечать на провокации, но настроение хорошее.
     
  18. kero

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

    Публикаций:
    0
    Регистрация:
    4 апр 2006
    Сообщения:
    1.074
    Адрес:
    Москва
    _DEN_
    Так что с PtVisible для чайлда ?
    А то для парента IsIconic имеется.
     
  19. _DEN_

    _DEN_ DEN

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

    Не успел попробовать :)

    Судя по всему все дело было как раз в загадочном невидимом WPF-контейнере. Я попросил WPF девелопера оповещать контрол когда его складывают в невидимый контейнер, и этого оказалось достаточно, чтобы D3D стал работать нормально.
     
  20. iZzz32

    iZzz32 Sergey Sfeli

    Публикаций:
    0
    Регистрация:
    3 сен 2006
    Сообщения:
    355
    В порядке бреда:
    Код (Text):
    1. GetWindowRect(window, &rc);
    2. pt.x = rc.left;
    3. pt.y = rc.top;
    4. ClientToScreen(window, &pt);
    5. if (pt.x > GetSystemMetrics(SM_CXSCREEN) && pt.y > GetSystemMetrics(SM_CYSCREEN))
    6.   ; // ...