2010-01-21 3 views
3

Utilisation de WinXP. Ce que je dois faire (pref en VB ou C#) est de détecter quand un autre programme (source fermée) affiche une bulle de notification dans le bac - et saisir les détails. Toute aide serait appréciée. MerciDétection de bulles de notification

+0

Alors qu'avez-vous essayé et que s'est-il passé? – Lazarus

Répondre

1

Dans des situations similaires, j'ai utilisé l'outil Microsoft Spy ++ pour saisir les informations de la fenêtre, puis utilise les appels PinVoke à FindWindow pour détecter quand la fenêtre est présente.

Je n'ai pas essayé avec un ballon de notification, mais j'imagine qu'un appel pinvoke à GetText récupérerait le contenu.

1

Je pense que vous aurez besoin d'utiliser pinvoke pour faire cela à partir d'un langage .net.

Sur le système que j'utilise maintenant (Vista Business SP2), les fenêtres du ballon semblent toujours avoir la classe de fenêtres #32769 (réservée aux fenêtres de bureau) et le bit de style Windows TTS_BALLOON.

Ce qui suit pourrait travail: Déterminer la fenêtre parent pour tous les ballons de notification en créant un temporaire, obtenir son hWnd, et d'appeler GetParent() avant de le supprimer. Vous pouvez ensuite interroger périodiquement les enfants de ce parent hwnd (en utilisant EnumWindows() ou FindWindowEx()) à la recherche de fenêtres avec la classe et le style requis.

Cela me semble hautement non portable et nécessitera probablement beaucoup de tests sur diverses plates-formes.

pinvoke.net et spy ++ pourrait être utile.

Bonne chance!

0

Vous aurez certainement besoin d'utiliser les appels API Win pour y parvenir. Si c'est la seule chose que vous essayez de faire, vous feriez mieux d'utiliser directement C ou C++ de sorte que vous n'avez pas à faire un tas d'invocation de plate-forme pour C# ou VB.

Depuis andyjohnson identified que la classe de fenêtre pour tous les ballons de notification est # 32769, et qu'ils ont le jeu de style TTS_BALLOON, vous pouvez utiliser un CBT hook (si vous n'êtes pas familier avec crochets Win32, vous voudrez peut-être read up on them), pour obtenir un rappel chaque fois qu'une fenêtre est créée, et vérifier les fenêtres de cette classe et avec ce style.

Je ne suis pas sûr, cependant, si une nouvelle fenêtre de ballon est créée pour les deuxièmes popups suivants ou si le même est juste caché et reshown. Si tel est le cas, vous aurez besoin d'un CallWndProc hook, pour obtenir WM_SHOWWINDOW messages.

Edit:

Je dois mentionner que les crochets que je l'ai mentionné ne peuvent pas être mises en œuvre dans .NET. À l'exception des hooks du clavier et de la souris de bas niveau, les hooks système globaux doivent être implémentés dans une DLL native (non managée). Windows chargera cette DLL dans d'autres processus, et si une DLL managée est chargée dans un processus sur lequel le CLR .NET n'est pas chargé, le processus sera planifié. (Même si le CLR est chargé, il peut être à une adresse différente, provoquant également un plantage.)

Vous devez donc créer vos hooks dans une DLL native (non gérée). Il est possible de s'interfacer d'ici à une application gérée, comme Michael Kennedy has done on Code Project, mais pour le faire correctement, et gérer les types de hook que j'ai mentionnés ci-dessus, vous devez utiliser la communication interprocessus, une étape que Michael Kennedy a omis.Dans l'ensemble, pour le but que vous avez décrit, il serait probablement plus facile de construire tout le code en natif.

+0

J'aime l'idée d'utiliser un crochet - mieux que ma suggestion d'utiliser l'interrogation. Vraisemblablement, cela ne fonctionnerait que dans un code non géré? –

+0

@andyjohnson: Oui, en fait c'est important et je vais mettre à jour ma réponse pour clarifier ça. –