Обнаружение уведомлений - PullRequest
       11

Обнаружение уведомлений

3 голосов
/ 21 января 2010

Использование WinXP. Что мне нужно сделать (pref в VB или c #), это определить, когда другая (с закрытым исходным кодом) программа отображает всплывающее окно с уведомлением в трее - и получить подробности. Любая помощь будет оценена. Спасибо

Ответы [ 3 ]

1 голос
/ 21 января 2010

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

В системе, которую я сейчас использую (Vista Business SP2), всплывающие окна всегда имеют класс окна # 32769 (зарезервирован для окон рабочего стола) и установлен бит стиля TTS_BALLOON.

Следующие могут работать: определить родительское окно для всех всплывающих уведомлений, создав временное окно, получив его hWnd и вызвав GetParent () перед его удалением. Затем вы можете периодически опрашивать дочерние элементы этого родительского hwnd (используя EnumWindows () или FindWindowEx () ) в поисках окон с требуемым классом и стилем.

Мне это кажется крайне непереносимым и, вероятно, потребует большого количества испытаний на различных платформах.

pinvoke.net и spy ++ могут быть полезны.

Удачи!

1 голос
/ 21 января 2010

В подобных ситуациях я использовал инструмент Microsoft Spy ++, чтобы получить информацию об окне, а затем использовал вызовы pinvoke для FindWindow, чтобы определить, когда окно присутствует.

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

0 голосов
/ 21 января 2010

Для этого вам обязательно нужно использовать вызовы Win API. Если это единственное, что вы пытаетесь сделать, вам лучше использовать прямой C или C ++, поэтому вам не нужно делать кучу платформенных вызовов для C # или VB.

Поскольку andyjohnson определил , что класс окна для всех всплывающих уведомлений - # 32769, и что у них установлен стиль TTS_BALLOON, вы можете использовать CBT hook (если вы Вы не знакомы с перехватчиками Win32, возможно, вы захотите прочитать о них ), чтобы получить обратный вызов при каждом создании окна и проверить наличие окон этого класса и с этим стилем.

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

Edit:

Я должен упомянуть, что упомянутые мной хуки не могут быть реализованы в .NET. За исключением низкоуровневых хуков клавиатуры и мыши, глобальные системные хуки должны быть реализованы в собственной (неуправляемой) DLL. Windows загрузит эту DLL в другие процессы, и если управляемая DLL будет загружена в процесс, в который не загружена .NET CLR, это приведет к сбою этого процесса. (Даже если CLR загружен, он может находиться по другому адресу, что также вызывает сбой.)

Таким образом, вы должны создавать свои ловушки в собственной (неуправляемой) DLL. Отсюда можно подключиться к управляемому приложению, такому как Майкл Кеннеди сделал в Code Project , но чтобы сделать это правильно и обработать типы хуков, которые я упомянул выше, вам нужно использовать межпроцессное взаимодействие, шаг, который Майкл Кеннеди пропустил. В целом, для целей, которые вы описали, вероятно, было бы проще просто собрать все это в нативном коде.

...