2010-08-12 5 views
0

J'ai une zone spécifiée sur l'écran (pas sur le formulaire, mais sur l'écran), par exemple, c'est la région dans le coin supérieur droit de l'écran. Je souhaite implémenter l'événement mouse over et mouse click pour cette région. Lorsque la souris était sur cette région, un bouton ou une image est apparu dans cette région. Si l'utilisateur clique sur cette région, l'événement de clic de la souris est exécuté.Implémenter la souris et l'événement de clic de souris pour la zone d'écran spécifiée

Comment puis-je le faire? S'il vous plaît, fournissez du code ou de bons liens.

C#, VS 2008, .net 2.0, 3.5

Répondre

2

Juste un avertissement avant de commencer que la solution ne va pas être assez, autant que je sache, vous ne pouvez pas le faire complètement dans le code managé.

Maintenant:

Afin d'intercepter les messages à une autre application que vous allez avoir besoin de faire des appels natifs à l'aide user32.dll. Si vous voulez comprendre tout cela à la dure, vous voulez commencer par SetWindowsHookEx. En supposant que vous n'êtes pas un masochiste, il y a une belle bibliothèque C# que j'ai trouvée sur CodeProject qui rendra la vie beaucoup plus facile que d'essayer manuellement d'intercepter ces messages vous-même. Configurer un rappel pour les messages de la souris avec les coordonnées X et Y pour la position de la souris, vous pouvez déterminer si elle est dans les limites de votre Rectangle en utilisant sa méthode Contains.

specifiedRegion.Contains(mouseLocation); //where mouseLocation is a Point 

User32 a aussi les fonctions que vous aurez besoin d'obtenir un contexte de périphérique pour l'écran:

[DllImport("User32.dll")] 
public static extern IntPtr GetDC(IntPtr hwnd); 

[DllImport("User32.dll")] 
public static extern void ReleaseDC(IntPtr dc); 

Pour obtenir le DC de l'écran, utilisez l'appel suivant à GetDC:

IntPtr screenDC = GetDC(IntPtr.Zero); 

Avec ce DC, nous pouvons obtenir notre objet C# Graphics et commencer à dessiner.

Graphics g = Graphics.FromHdc(screenDC); 

Rappelez-vous de disposer l'objet Graphics et relâchez le DC après avoir terminé avec elle ou vous aurez une fuite de mémoire.

g.Dispose(); 
ReleaseDC(screenDC); 
1

Il existe une façon très simple de faire cela. Il suffit de faire un contrôle de panneau dans la région où vous voulez que cela se produise. Utilisez les événements mousemove et mouseclick du contrôle de panneau pour capturer vos entrées, et vous pouvez même copier n'importe quelle image que vous voulez directement sur le panneau. Cela encapsule l'ensemble de l'opération dans le panneau, évitant le besoin de manipulation en dehors de la classe du panneau.

+1

N'est-ce pas un panneau * invisible * situé sur une forme * invisible * séparée? Cela ne me semble pas si simple. (Il y a des façons de le faire, cependant) – Justin

Questions connexes