2010-01-21 4 views
3

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

+0

Итак, что вы пробовали и что произошло? – Lazarus

ответ

1

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

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

1

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

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

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

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

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

Удачи вам!

0

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

С andyjohnson identified что классом окна для всех воздушных шаров уведомления является # 32769, и что они имеют множество TTS_BALLOON стиля, вы могли бы использовать CBT hook (если вы не знакомы с Win32 крючками, вы можете read up on them), для получения обратного вызова при каждом создании окна и проверки окон этого класса и с этим стилем.

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

Edit:

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

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

+0

Мне нравится идея использования крючка - лучше, чем мое предложение использовать опрос. Предположительно, это будет работать только в неуправляемом коде? –

+0

@andyjohnson: Да, на самом деле это важно, и я обновлю свой ответ, чтобы это было ясно. –