Остановка окна приложения, перекрывающего стартовую панель Windows

#c #winapi

#c #winapi

Вопрос:

На моем ПК с Win7 у меня панель запуска работает вертикально, ее ширина составляет около 60 пикселей. В моем приложении win32 созданное окно всегда появляется, перекрывая стартовую панель, что выглядит плохо — я просто использую (0,0) в качестве верхней левой позиции окна.

Как я должен это делать, чтобы получить (0,0) относительно рабочего стола с учетом панели запуска? Есть ли флаг, или мне нужно вручную искать метрику?

Ответ №1:

Здесь есть несколько проблем. Вы не хотите использовать жестко заданное значение, например (0,0) . Это может быть даже не видно в системе с несколькими мониторами. Как вы обнаружили, вы должны стараться избегать перекрытия с панелью задач или другими панелями приложений. Если есть несколько мониторов, вам следует попробовать запустить на том мониторе, с которым пользователь взаимодействовал совсем недавно.

Есть простой способ сделать большую часть этого бесплатно. CW_USEDEFAULT x При вызове передайте в качестве y координат и CreateWindow . Это позволит оконному менеджеру выполнить тяжелую работу по отображению вашего окна в удобном месте.


Вы можете заставить систему сообщить вам координаты рабочей области. Рабочая область — это та часть рабочего стола, которая не содержит панели задач или других панелей приложений. SystemParametersInfo Передача вызова SPI_GETWORKAREA .

Извлекает размер рабочей области на основном мониторе отображения. Рабочая область — это часть экрана, не закрытая системной панелью задач или панелями инструментов рабочего стола приложения. Параметр pvParam должен указывать на RECT структуру, которая получает координаты рабочей области, выраженные в координатах виртуального экрана. Чтобы получить рабочую область монитора, отличного от основного монитора отображения, вызовите GetMonitorInfo функцию.

Комментарии:

1. Вы правы в отношении правильной поддержки нескольких мониторов, но в этом простом случае, я думаю CW_USEDEFAULT , это то, что мне нужно, чтобы избежать «незаконных» размещений? Можете ли вы подтвердить, что это лучше, чем SetWindowPlacement ответ Раймонда?

2. @John Я бы не решился сказать, что мое предложение было лучше, чем у кого-то вроде Raymond . Все зависит от того, чего вы пытаетесь достичь. Я думаю, что Рэймонд ответил на ваш прямой вопрос, тогда как я, возможно, посмотрел на него с более широкой точки зрения.

3. @John CW_USEDEFAULT — хорошее начало, но однажды вы можете захотеть улучшить свою программу, заставив ее запомнить, где она была, когда она закрывалась в последний раз, а затем возобновить работу в этом месте при следующем запуске.

Ответ №2:

Использование SetWindowPlacement . Значение (0,0) для этой функции исключает панель задач и любые другие панели приложений.