【问题标题】:C# cursor highlighting/followerC# 光标高亮/跟随
【发布时间】:2011-02-07 00:48:49
【问题描述】:

如何高亮系统光标?就像许多屏幕录制应用程序一样。理想情况下,我想在它周围显示一个光环。 谢谢

【问题讨论】:

    标签: c# .net cursor highlighting


    【解决方案1】:

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

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

    例如,通过使用计时器,您可以每 20 毫秒更新一次鼠标位置并绘制新的万圣节(椭圆)。

    我能想到其他更有效的方法,但它们需要使用系统挂钩的未管理代码。查看 SetWindowsHookEx 了解更多信息。

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

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

    【讨论】:

    • 感谢克里斯,我已经成功地使用钩子和 Graphics.FromHwnd 绘制了一个半透明的光环。但是,我无法擦除先前绘制的圆圈。 InvalidateRect 似乎无法与 IntPtr.Zero 或 GetDesktopWindow 一起正常工作。有什么想法吗?
    • 嗨约翰,所以我在考虑你恢复桌面的问题,我有以下想法。与其像我最初建议的那样直接在桌面上绘图,为什么现在使用表格。所以新建一个Form,Hallow Form,设置FormBorderStyle=None,BackColor=LightGreen,TransparencyKey=LightGreen,TopMost=true,ShowInTaskBar=false,Width=100,Height=100。这为您提供了一个不显示的表单,但您在 PaintEvent 中的表单上绘制的任何内容都会显示。然后在计时器事件中从初始答案更新窗口位置以跟踪鼠标。从快速测试来看,它看起来不错。
    • 我能想到的唯一明显的问题是另一个窗口可能在您的窗口之后的最上面,在这种情况下,这个神圣不会显示在那个窗口上。
    • @Yiping,由于绘图是在透明表格上完成的,您只需清除表格内容即可。您需要管理在 Paint 处理程序 (HalloForm_Paint) 中绘制的内容,并且可以使用 Update 强制重新绘制窗口。
    • @ChrisTaylor 谢谢!在“清除”之后,屏幕就乱了。 “强制重绘窗口”完成了这项工作。
    猜你喜欢
    • 2021-01-15
    • 2020-09-04
    • 1970-01-01
    • 2021-12-05
    • 1970-01-01
    • 2011-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多