Использование WinXP. То, что мне нужно сделать (pref в VB или C#), - это обнаружить, когда другая (закрытая исходная) программа отображает воздушный шар с уведомлением в лотке - и захватите детали. Любая помощь будет оценена по достоинству. СпасибоОбнаружение уведомлений Воздушные шары
ответ
В подобных ситуациях я использовал инструмент Microsoft Spy ++ для захвата информации о окне, а затем использует вызовы pinvoke для FindWindow
, чтобы обнаружить, когда окно присутствует.
Я не пробовал с помощью воздушного шара с уведомлением, но я полагаю, что вызов pinvoke в GetText
доставит содержимое.
Я думаю, вам нужно использовать pinvoke для этого с языка .net.
В системе, которую я использую сейчас (Vista Business SP2), окна с воздушным шаром всегда имеют оконный класс #32769 (зарезервирован для окон на рабочем столе) и бит стиля TTS_BALLOON.
Следующая мощь работы: Определить родительское окно для всех воздушных шаров уведомления, создавая временный, получив его HWND, и вызов GetParent() перед удалением. Затем вы можете периодически опросить детей этого родительского hwnd (используя EnumWindows() или FindWindowEx()), ища окна с требуемым классом и стилем.
Это кажется очень не переносным для меня и, вероятно, потребует много испытаний на различных платформах.
pinvoke.net и шпион ++ могут быть полезны.
Удачи вам!
Для этого вам обязательно нужно использовать вызовы 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. Здесь можно подключиться к управляемому приложению, например , но для того, чтобы сделать это правильно и обработать типы крюков, о которых я упомянул выше, вам нужно будет использовать межпроцессное общение - шаг, который Майкл Кеннеди упустил.В целом, для описанной цели, вероятно, было бы проще просто построить все в собственном коде.
Мне нравится идея использования крючка - лучше, чем мое предложение использовать опрос. Предположительно, это будет работать только в неуправляемом коде? –
@andyjohnson: Да, на самом деле это важно, и я обновлю свой ответ, чтобы это было ясно. –
Итак, что вы пробовали и что произошло? – Lazarus