2012-05-19 4 views
0

У меня есть класс, который обращается к API win32, чтобы вытащить местоположение, размер, состояние и край панели задач. Я использую класс, чтобы знать, где создавать предупреждения, в зависимости от того, где находится панель задач. У меня есть метод, который обновляет местоположение предупреждений в зависимости от того, когда панель задач находится, когда генерируется или удаляется новое предупреждение.Может ли обнаружено перемещение панели задач?

Есть ли способ обнаружить, когда панель задач перемещается, поэтому я могу вызвать метод обновления? Таким образом, если пользователь перемещает панель задач, предупреждения перемещаются в соответствующее место, а не находятся в смешном месте до появления нового предупреждения или удаляются.

Моя мысль заключалась в том, чтобы проверить таймер на текущий объект панели задач, который я генерировал последним, с новой, каждую секунду или около того, и вызывая метод обновления, если что-то изменится. Мне просто интересно, есть ли «более простой» или «лучший» способ сделать это.

(с помощью Visual Studio 2010 C#)

TL; DR нужно определить, когда панель задач перемещается для вызова метода.

+0

Нет, только не пользователи не постоянно перемещать панель задач вокруг. Pinvoke SHAppBarMessage() с ABM_GETTASKBARPOS, чтобы узнать, где находится панель, чтобы разместить новое окно предупреждения. Если вы хотите сделать это по таймеру, тогда нет ничего плохого в этом, если вы не делаете этого каждые миллисекунды. –

+1

Правильный способ добиться этого - запросить позицию панели задач непосредственно перед отображением вашего предупреждения. Уведомление при перемещении панели задач или использовании таймера будет совершенно ненужным. –

+0

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

ответ

-1

Общая идея, вы должны подклассировать окно панели задач. Как вы можете теперь, каждое окно определяет то, что называется WndProc (оконная процедура), которое обрабатывает все сообщения, отправленные системой или другими окнами.

У вас нет прямого доступа к этой функции, но вы можете использовать правый API (SetWindowLong), перенаправить поток сообщений на другую функцию WndProc по своему выбору (не забудьте вернуть старый WndProc так, чтобы целевое окно функция обычно).

Посредством этого вы можете отслеживать все сообщения, полученные целевым окном. В частности, сообщение WM_MOVE в вашем случае.

Это упрощенное объяснение, я рекомендую внимательно прочитать об этом.

вот начиная ссылка:

http://msdn.microsoft.com/en-us/library/windows/desktop/ms633569(v=vs.85).aspx

+1

-1. Это просто неправильно. Подклассирование окна панели задач является последним взломом, которого следует избегать.Вы добавляете накладные расходы своей функции, вызываемой для каждого приложения в системе, которая начинается после вашего, и вводит проблемы, если ваша сбой произошла или по какой-то причине возникла ошибка. Если по какой-то причине вы чувствуете необходимость подкласса windproc на системном уровне, вы, вероятно, делаете что-то неправильно. –

+0

Нет такой вещи, как накладные расходы на вызываемую вами функцию .... Это не крючок. Я думаю, что вы ошибаетесь. –

+0

ОК. -1 для подклассификации без необходимости, когда есть лучшие решения. Замена WndProc, когда это не нужно, неверно. Лучше? Вам не нужно «контролировать все сообщения, полученные целевым окном», когда все, что вас интересует, - это случайное оповещение. Вам не нужно ловить тысячи оконных сообщений, которые отправляются, чтобы обнаружить тот, который случается очень редко. –

 Смежные вопросы

  • Нет связанных вопросов^_^