2010-04-12 4 views
2

Comment mettre en surbrillance le curseur système? Comme de nombreuses applications d'enregistrement d'écran le font. Idéalement, j'aimerais montrer un halo autour d'elle. MerciSurligneur/suiveur C#

Répondre

5

Pour une solution purement gérée, le code suivant dessine une ellipse sur le bureau à la position actuelle du curseur de la souris.

Point pt = Cursor.Position; // Get the mouse cursor in screen coordinates 

using (Graphics g = Graphics.FromHwnd(IntPtr.Zero)) 
{   
    g.DrawEllipse(Pens.Black, pt.X - 10, pt.Y - 10, 20, 20); 
} 

En utilisant une minuterie, vous pouvez mettre à jour la position de la souris tous les 20ms par exemple et dessiner la nouvelle Hallow (ellipse).

Il y a d'autres façons plus efficaces que je peux penser, mais ils auraient besoin de code non-émargé en utilisant des crochets du système. Jetez un oeil à SetWindowsHookEx pour plus d'informations à ce sujet. Mise à jour: Voici un échantillon de la solution que j'ai décrite dans mes commentaires, ceci est juste approximatif et prêt à des fins de test.

public partial class Form1 : Form 
    { 
    private HalloForm _hallo; 
    private Timer _timer; 

    public Form1() 
    { 
     InitializeComponent(); 
     _hallo = new HalloForm(); 
     _timer = new Timer() { Interval = 20, Enabled = true }; 
     _timer.Tick += new EventHandler(Timer_Tick); 
    } 

    void Timer_Tick(object sender, EventArgs e) 
    { 
     Point pt = Cursor.Position; 
     pt.Offset(-(_hallo.Width/2), -(_hallo.Height/2)); 
     _hallo.Location = pt; 

     if (!_hallo.Visible) 
     { 
     _hallo.Show(); 
     } 
    }  
    } 

    public class HalloForm : Form 
    {   
    public HalloForm() 
    { 
     TopMost = true; 
     ShowInTaskbar = false; 
     FormBorderStyle = FormBorderStyle.None; 
     BackColor = Color.LightGreen; 
     TransparencyKey = Color.LightGreen; 
     Width = 100; 
     Height = 100; 

     Paint += new PaintEventHandler(HalloForm_Paint); 
    } 

    void HalloForm_Paint(object sender, PaintEventArgs e) 
    {  
     e.Graphics.DrawEllipse(Pens.Black, (Width - 25)/2, (Height - 25)/2, 25, 25); 
    } 
    } 
+0

Merci Chris, j'ai réussi à dessiner un halo semi-transparent en utilisant des crochets et Graphics.FromHwnd. Cependant, j'ai du mal à effacer le cercle précédemment peint. InvalidateRect ne semble pas fonctionner correctement avec IntPtr.Zero ou GetDesktopWindow. Des idées? – SharpAffair

+0

Salut John, donc je pensais à votre problème de restauration du bureau et j'ai eu l'idée suivante. Au lieu de dessiner directement sur le bureau comme je l'ai initialement suggéré, pourquoi maintenant utiliser un formulaire. Donc, créez un nouveau Formulaire, forme Hallow, définissez FormBorderStyle = None, BackColor = LightGreen, TransparencyKey = LightGreen, TopMost = true, ShowInTaskBar = false, Largeur = 100, Hauteur = 100. Cela vous donne un formulaire qui ne s'affiche pas, mais tout ce que vous dessinez sur le formulaire dans PaintEvent s'affichera. Ensuite, dans l'événement de minuterie de la réponse initiale, mettez à jour la position de la fenêtre pour suivre la souris. A partir d'un test rapide, il semblait bien. –

+0

Seulement le problème évident que je peux penser est qu'une autre fenêtre pourrait être le plus haut après votre fenêtre dans quel cas cette hallow ne montrerait pas au-dessus de cette fenêtre. –