2009-11-05 2 views
1

Кто-нибудь знает об способ обнаружения движения любых окон, открытых в настоящее время в системе Windows? Мне нужно определить движение окна, определить, сталкивается ли оно с моей формой приложения, и удалять ее из-под нее, если это необходимо.Обнаружение и предотвращение перекрытия окон в C#

Я знаю, что могу прокручивать список и проверять каждое окно, но это способ интенсивно выполнять постоянно.

фона:

У меня есть панель задач в стиле приложение, которое доки на стороне экрана пользователя. Когда функция «Всегда сверху» включена, максимизированные окна занимают оставшееся свободное пространство, не закрывая панель инструментов, как и ожидалось.

Однако, если вы перетащили не-максимизированное окно над панелью инструментов, приложение пойдет за панель инструментов (также ожидается), но вы больше не можете захватывать строку заголовка, чтобы переместить ее обратно - окно застревает, если вы отключите «Always on Top», а затем переместите его. Итак, я хочу выбить окно из-под него.

+0

Примечание: пользователи всегда могут использовать клавиатуру, чтобы переместить его обратно: ALT + SPACE, M, со стрелкой вправо (или любую клавишу со стрелкой на самом деле), то окно следует за мышью. –

+0

@jeffamaphone: не многие пользователи знают, что хотя –

+1

Конечно, пользователи могут ... но они также будут очень вокально об их неодобрении этого метода :) – Matt

ответ

0

Попробуйте проверить свой PaintEventArgs ClipRectangle ..

(редактирование: и/или WindowFromPoint матч съемки)

+0

Я думаю, что он хочет переместить окно, в котором он не принадлежит, а не один он делает. –

+0

Jeffamaphone правильный - я ищу, чтобы обнаружить перекрывающиеся окна, которые являются внешними по отношению к моему приложению. – Matt

+0

ах, нормально .. отредактировано с дополнительным предложением .. есть хак :) –

1

Хотя не прямой ответ, один из возможных решений этой проблемы является создание приложения в качестве панели инструментов рабочего стола приложения а не регулярное окно. От the docs:

Панель инструментов приложения (также называемая панелью приложений) представляет собой окно, похожее на панель задач Microsoft Windows. Он привязан к краю экрана ... Система запрещает другим приложениям использовать область рабочего стола, занимаемую панелью приложений. (выделено мной)

Это может быть не очень удобно для вашего сценария, потому что оно ориентировано на COM и неуправляемый код, а не на управляемые приложения: однако см. this CodeProject article для получения информации об использовании этой функции с C#.

В противном случае, вы можете попробовать установить крюк (см SetWindowsHookEx) и прослушивания для перемещения сообщений, но это довольно низкого уровня ...

+0

Спасибо за предложение. Приложение уже в настоящее время зарегистрировано как панель инструментов приложения на рабочем столе, поэтому максимизация окон будет соответствовать правилам. Панель задач Windows (панель инструментов другого приложения) фактически имеет ту же проблему, что и моя, - переместите панель задач в верхнюю часть экрана и установите ее «Всегда сверху». Затем перетащите еще одно окно, чтобы вся строка заголовка была над панелью задач, и вы больше не можете перемещать окно. Исключением является это в Windows 7, где на панели задач Windows есть поведение, которое я желаю, и выйдет из окна. – Matt

+0

Я попробую идею SetWindowsHookEx и посмотрю, действительно ли это трюк. Я не беспокоюсь о том, чтобы идти на низкоуровневый уровень, если он работает без слишком большого количества ресурсов. – Matt

0

Вы можете получить уведомление оконных движений с помощью крючка ТОС: http://msdn.microsoft.com/en-us/library/ms644977(VS.85).aspx

+0

У меня это подключено, и похоже, что он должен работать, но в настоящее время я могу получить его, чтобы дать мне обратную связь для движений окна, которые принадлежат моему приложению. Если я могу получить это, чтобы дать мне обратные вызовы для любых окон в системе, мы в бизнесе! – Matt

+0

В соответствии с http://support.microsoft.com/default.aspx/kb/318804 и другими источниками вы не можете создавать глобальные перехватчики окон из приложения .NET (кроме тех, кто смотрит движения клавиатуры и мыши), без реализуя их в C++ DLL. Наверное, я начну рассматривать это, поскольку это, по-моему, единственный вариант. – Matt

0

http://www.codeproject.com/KB/dialog/FindWindow.aspx?msg=3262771

"FindWindow Йорга Bausch"

Получит вам внешний (а не приложения) окна ID (IntPtr) мышь пошла вверх над из приложения C#. Для рабочего стола и всего остального на рабочем столе он вернет тот же указатель (вы не можете отличить, используя этот код, как мышь в папке, на рабочем столе, в Корзине).

http://www.codeproject.com/KB/cs/globalhook.aspx

«Обработка глобальной мыши и клавиатуры Крючки в C# Джордж Мамаладзе»

Позволит создавать GlobalHook для клавиатуры и мыши-событий в C#. Я использовал его недавно в VS 2010 бета-версии 2: он не был составлен USABLE против FrameWork 4.0, но компилируется и работает хорошо с FrameWork 3.5 и ниже.Если вы загружаете только демонстрационное приложение Джорджа, имейте в виду, что загрузка не включает требуемую DLL, и не удастся при запуске файла .exe (что я привлек к вниманию Джорджа).

Я никогда не работал с панелью инструментов для настольных приложений; Надеюсь, это актуально.

лучше,