2010-04-12 38 views

回答

5

对于纯粹管理的解决方案,下面的代码将在当前鼠标光标位置的桌面上绘制一个椭圆。

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); 
} 

通过使用计时器,您可以每隔20ms更新一次鼠标位置并绘制新的hallow(椭圆)。

还有其他更有效的方法,我可以想到,但他们需要使用系统挂钩unamanged代码。看看SetWindowsHookEx了解更多信息。

更新:这里是我在我的评论中描述的解决方案的示例,这只是粗略的,可用于测试目的。

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

感谢克里斯,我设法使用钩子和Graphics.FromHwnd绘制一个半透明的光环。但是,我无法清除先前绘制的圆。 InvalidateRect似乎无法正确使用IntPtr.Zero或GetDesktopWindow。有任何想法吗? – SharpAffair 2010-04-12 21:23:58

+0

嗨,约翰,所以我在想你恢复桌面的问题,我有以下想法。正如我最初所建议的,不是直接在桌面上绘图,而是为什么现在要使用表单。所以创建一个新的Form,Hallow Form,设置FormBorderStyle = None,BackColor = LightGreen,TransparencyKey = LightGreen,TopMost = true,ShowInTaskBar = false,Width = 100,Height = 100。这会给你一个不显示的窗体,但是你在PaintEvent窗体上绘制的任何东西都会显示出来。然后在初始答案的计时器事件中更新窗口位置以跟踪鼠标。从快速测试看起来很好。 – 2010-04-13 07:21:54

+0

我能想到的唯一明显问题是,另一个窗口可能在窗口之后最高,在这种情况下,这个窗口不会显示在窗口之上。 – 2010-04-13 07:24:16