在 WebBrowser 控件中的某些非活动鼠标时间后隐藏鼠标光标

Hide mouse cursor after certain inactive mouse time in a WebBrowser Control

我试图让鼠标光标在鼠标不动一段时间后消失。 There's already a question on this 但 WebBrowser 控件表单没有鼠标事件。我有上面链接的问题中提到的代码:

public partial class Form1 : Form
{
public TimeSpan TimeoutToHide { get; private set; }
public DateTime LastMouseMove { get; private set; }
public bool IsHidden { get; private set; }

public Form1()
{
    InitializeComponent();
    TimeoutToHide = TimeSpan.FromSeconds(5);
    this.MouseMove += new MouseEventHandler(Form1_MouseMove);
}

void Form1_MouseMove(object sender, MouseEventArgs e)
{
    LastMouseMove = DateTime.Now;

    if (IsHidden) 
    { 
        Cursor.Show(); 
        IsHidden = false; 
    }
}

private void timer1_Tick(object sender, EventArgs e)
{
    TimeSpan elaped = DateTime.Now - LastMouseMove;
    if (elaped >= TimeoutToHide && !IsHidden)
    {
        Cursor.Hide();
        IsHidden = true;
    }
  }
}

WebBrowserControl 不支持 MouseMove 事件。相反,您可以使用 MouseMove event of WebBrowser.Document.Body

然后应用您用于显示和隐藏光标的逻辑。在计时器 Tick 事件中检查最后一次移动是否在特定时间之前,使用 Cursor.Hide. Also in MouseMove show the cursor using Cursor.Show 方法隐藏光标。

DateTime? lastMovement;
bool hidden = false;
void Form1_Load(object sender, EventArgs e)
{
    webBrowser1.Navigate("http://www.google.com");
}
void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{
    webBrowser1.Document.MouseMove += Document_MouseMove;
}
void Document_MouseMove(object sender, HtmlElementEventArgs e)
{
    lastMovement = DateTime.Now;
    if (hidden)
    {
        Cursor.Show();
        hidden = false;
    }
}
private void timer1_Tick(object sender, EventArgs e)
{
    if (!lastMovement.HasValue)
        return;
    TimeSpan elaped = DateTime.Now - lastMovement.Value;
    if (elaped >= TimeSpan.FromSeconds(2) && !hidden)
    {
        Cursor.Hide();
        hidden = true;
    }
}

备注

  • bool hidden的工作是在ShowHide之间保持平衡,因为如文档中所述:

    The Show and Hide method calls must be balanced. For every call to the Hide method there must be a corresponding call to the Show method.

  • 在文档完成时订阅 MouseMove,因为 Document 在完成 DocumentCompleted 事件引发之前将为空。

  • 我检查了如果 lastMovement 没有值然后没有隐藏光标,以防止在用户将鼠标移到控件上之前在启动时隐藏光标。