Конференция "WinAPI" » Определение самого верхнего окна в выделенной области экрана [D7, WinXP]
 
  • dmitry_12_08_73 © (25.11.08 15:43) [0]
    Подскажите, как можно определить handle самого верхнего окна в выделенной области экрана, если на экране много открытых перекрывающихся окон.
  • Сергей М. © (25.11.08 15:50) [1]

    > в выделенной области экрана


    В это области запросто может оказаться несколько "самых верних" окон.

    тебя какое из них интересует ?
  • Сергей М. © (25.11.08 17:03) [2]

    > dmitry_12_08_73


    Пусть окно А перекрывает окно В, а окно С перекрывает окно D.

    Окна А и С, являясь неперекрывающими одно другое "верхними" окнами, попадают (частично или полностью) в "выделенную область".

    Вопрос на засыпку: какое из окон является "самым верхним" - А или С ?
  • Palladin © (25.11.08 18:27) [3]
    у которого Z-order больше :)
  • dmitry_12_08_73 © (25.11.08 18:40) [4]
    а как определить Z-order окна
  • Сергей М. © (25.11.08 20:31) [5]

    > у которого Z-order больше


    А с  какого перепугу он будет у них разный ?)
  • DVM © (25.11.08 22:43) [6]

    > А с  какого перепугу он будет у них разный ?)

    У всех top-level окон разный z-order.


    > dmitry_12_08_73 ©   (25.11.08 18:40) [4]
    >
    > а как определить Z-order окна

    Никак. Надо перебрать все топ-левел окна, выделить среди них те, что попадают в твой прямоугольник. Перебирать надо функцией GetNextWindow(). Она движется как раз по списку окон по оси z.


    The Z order of a window indicates the window's position in a stack of overlapping windows. This window stack is oriented along an imaginary axis, the z-axis, extending outward from the screen. The window at the top of the Z order overlaps all other windows. The window at the bottom of the Z order is overlapped by all other windows.

    Windows maintains the Z order in a single list. Windows are added to the Z order based on whether they are topmost windows, top-level windows, or child windows. A topmost window overlaps all other non-topmost windows, regardless of whether it is the active or foreground window. A topmost window has the WS_EX_TOPMOST style. All topmost windows appear in the Z order before any non-topmost windows. A child window is grouped with its parent in Z order.
    When an application creates a window, Windows puts it at the top of the Z order for windows of the same type. You can use the BringWindowToTop function to bring a window to the top of the Z order for windows of the same type. You can rearrange the Z order by using the SetWindowPos and DeferWindowPos functions.

    The user changes the Z order by activating a different window. Windows positions the active window at the top of the Z order for windows of the same type. When a window comes to the top of Z order, so do its child windows. You can use the GetTopWindow function to search all child windows of a parent window and return the handle of the child window that is highest in Z order. The GetNextWindow function retrieves the handle of the next or previous window in Z order.

  • dmitry_12_08_73 © (25.11.08 23:11) [7]
    Большое спасибо
  • Palladin © (25.11.08 23:41) [8]

    > Сергей М. ©  (25.11.08 20:31) [5]

    хто позже bringtofront'нулся у того и больше :)
    но есть паршивые исключения из правил хди...
    в виде оверлеев, tskmanager'а, dx приложений, ogl приложений...

    сплошной беспредел, да ты вообще лучше меня знаешь :)
  • DVM © (26.11.08 11:33) [9]

    > Palladin ©   (25.11.08 23:41) [8]


    > в виде оверлеев

    это не окно же


    > tskmanager'а

    Обычное окно, и перекрыть его можно тоже.


    > dx приложений, ogl приложений...

    Они же работают тоже на, скажем так, поверхности обычных окон.

    Так что из исключений только менюшка монитора :)
  • имя (12.01.09 12:02) [10]
    Удалено модератором
 
Конференция "WinAPI" » Определение самого верхнего окна в выделенной области экрана [D7, WinXP]
Есть новые Нет новых   [134435   +35][b:0][p:0.001]