Windows позволяет относительно просто определить размер рабочей области пользователя на основном мониторе (т. Е. Область экрана, не скрытую панелью задач).Вызовите функцию SystemParametersInfo
и укажите флаг SPI_GETWORKAREA
для первого параметра (uiAction
).Параметр pvParam
должен указывать на RECT
структуру , которая будет получать координаты рабочей области в координатах виртуального экрана.
Как только вы получите координаты, которые описывают рабочуюобласть, это просто вопрос сравнения их с текущей позицией окна вашего приложения, чтобы определить, находится ли он в этих пределах.
Желание поддерживать несколько мониторов несколько усложняет ситуацию.Документация для SystemParametersInfo
предполагает, что вам нужно вместо этого вызвать GetMonitorInfo
функцию , чтобы получить рабочую область монитора, отличную от основного.Он заполняет структуру, называемую MONITORINFOEX
, которая содержит элемент rcWork
, который определяет рабочую область этого монитора, снова выраженную в координатах виртуального экрана как структура RECT
.
Чтобы сделать это правильно, вам нужно перечислить все мониторы, которые пользователь подключил к системе, и получить рабочую область каждого из них, используя GetMonitorInfo
.
. Есть несколькопримеры этого можно найти в Интернете:
- В MSDN есть пример кода для Позиционирование объектов на нескольких дисплеях Настройка .
- Если вы используетеMFC, вот что выглядит как отличный пример поддержки нескольких мониторов.
- Даже если вы не используете MFC, эта статья ссылается на следующую ссылку , которая выглядитбыть настоящим сокровищем в объяснении того, как поддержка нескольких мониторов работает в Windows, даже если это немного старая школа.Нравится вам это или нет, но в последних версиях Windows это очень мало изменилось.
Наконец, вы упомянули, что хотите обнаружить изменения разрешения.Это гораздо проще, чем вы могли себе представить.Как вы знаете, если вы занимались программированием на Windows, основной способ взаимодействия операционной системы с вашим приложением - это отправка сообщений в вашу WindowProc
функцию .
В этом случае вы будетехотите отслеживать сообщение WM_DISPLAYCHANGE
, которое отправляется во все окна при изменении разрешения дисплея.wParam
содержит новую глубину изображения в битах на пиксель;младшее слово lParam
указывает разрешение по горизонтали, а старшее слово lParam
определяет разрешение экрана по вертикали.