【问题标题】:Hide mouse cursor for specific time隐藏鼠标光标特定时间
【发布时间】:2017-06-07 09:00:37
【问题描述】:
public partial class Form3 : Form
{
    private readonly KeyboardHookListener m_KeyboardHookManager;
    private readonly MouseHookListener m_MouseHookManager;

    [DllImport("user32")]
    private static extern Int32 ClipCursor(RECT lpRect);

    [DllImport("user32")]
    private static extern Int32 ShowCursor(Int32 bShow);

    [DllImport("user32.dll")]
    public static extern bool GetCursorPos(out POINT lpPoint);

    [StructLayout(LayoutKind.Sequential)]
    public struct POINT
    {
        public int X;
        public int Y;

        public static implicit operator Point(POINT point)
        {
            return new Point(point.X, point.Y);
        }
    }

    public static Point GetCursorPosition()
    {
        POINT lpPoint;
        GetCursorPos(out lpPoint);
        //bool success = User32.GetCursorPos(out lpPoint);
        // if (!success)

        return lpPoint;
    }

    [StructLayout(LayoutKind.Sequential)]
    private struct RECT
    {
        public Int32 Left;
        public Int32 Top;
        public Int32 Right;
        public Int32 Bottom;
    }

    public Form3()
    {
        InitializeComponent();

        m_KeyboardHookManager = new KeyboardHookListener(new GlobalHooker());
        m_KeyboardHookManager.Enabled = true;
        m_KeyboardHookManager.KeyDown += HookManager_KeyDown;
        m_KeyboardHookManager.KeyUp += HookManager_KeyUp;

        m_MouseHookManager = new MouseHookListener(new GlobalHooker());
        m_MouseHookManager.Enabled = true;
        m_MouseHookManager.MouseDown += HookManager_MouseDown;
        m_MouseHookManager.MouseUp += HookManager_MouseUp;
    }

    private void Form3_Load(object sender, EventArgs e)
    {
        //ShowCursor(0);
        //MoveCursor();
    }
    private void HookManager_KeyDown(object sender, KeyEventArgs e)
    {
        label1.Text = e.KeyData.ToString() + " Pressed";
    }

    private void HookManager_KeyUp(object sender, KeyEventArgs e)
    {
        label1.Text = e.KeyData.ToString() + " Released";
    }

    private void HookManager_MouseUp(object sender, MouseEventArgs e)
    {
        label1.Text = e.Button.ToString() + " Released";
    }

    private void HookManager_MouseDown(object sender, MouseEventArgs e)
    {
        label1.Text = e.Button.ToString() + " Pressed";
        ShowCursor(0);
        MoveCursor();
        System.Threading.Thread.Sleep(5000);//5 sec   
        RestoreCursor(this);
        ShowCursor(1);
    }

    private void button1_Click(object sender, EventArgs e)
    {
        //RestoreCursor(this);
        //ShowCursor(1);
    }

    private void Form3_MouseMove(object sender, MouseEventArgs e)
    {
        //MoveCursor();
    }

    private RECT MouseTrap;
    public void RestoreCursor(System.Windows.Forms.Form ThisForm)
    {
        var _with1 = MouseTrap;
        _with1.Top = 0;
        _with1.Left = 0;
        _with1.Right = Screen.PrimaryScreen.Bounds.Width;
        _with1.Bottom = Screen.PrimaryScreen.Bounds.Height;

        ClipCursor(_with1);
    }

    private void MoveCursor()
    {
        // set the Current cursor, move the cursor's Position,
        // and set its clipping rectangle to the form. 
        this.Cursor = new Cursor(Cursor.Current.Handle);
        Cursor.Position = new Point(this.Left, this.Top);
        Cursor.Clip = new Rectangle(this.Left, this.Top, this.Width, this.Height);            
    }
}

我正在开发一个示例应用程序我的要求是当用户单击桌面上的任何位置时,例如单击 Windows“开始”按钮,然后将光标隐藏 2 秒,然后在 2 秒后在同一位置显示光标。

为此,我编写了上面的代码并使用Thread.Sleep(2000) 等待但光标位置恢复到窗体的左侧。

https://stackoverflow.com/questions/16781948/how-can-i-hook-globaly-all-the-keys-and-all-the-mouse-buttons/16782294

GlobalMouseHookDLL

【问题讨论】:

  • 我敢肯定你不想听到这个,但这是一个糟糕的、考虑不周的想法。它会以各种微妙的方式中断,并且您的代码会做出一些无法概括的重要假设,因此无法在所有系统配置中可靠地工作。此外,它远非防弹。用户可以通过多种方式重新启用鼠标,所以这实际上并没有做任何事情,只是制造了一个烦人的障碍。为什么这甚至是“要求”?我无法想象它将如何服务于任何建设性目的。

标签: c# .net winforms cursor


【解决方案1】:

您可以使用System.Windows.Forms.Timer 来实现。

在您的表单上声明 Timer

public partial class Form3 : Form
{
    private Timer timer = new Timer();

设置为Form_Load

timer.Enabled = false;
timer.Tick += Timer_Tick;
timer.Interval = 5000;

当用户移动鼠标时,而不是Thread.Sleep 激活计时器。当计时器计时(当指定的 5000 毫秒过去时),Timer_Tick 方法将执行。在里面,显示指针。

private void HookManager_MouseDown(object sender, MouseEventArgs e)
{
    label1.Text = e.Button.ToString() + " Pressed";
    ShowCursor(0);
    MoveCursor();
    timer.Start();
}

private void Timer_Tick(object sender, EventArgs e)
{

    RestoreCursor(this);
    ShowCursor(1);
    timer.Stop();
}

【讨论】:

  • 我在上面的代码中添加了 timer_tick 但仍然无法正常工作 鼠标按下事件仅在第一次而不是第二次触发
  • @John 你能在Timer_Tick 方法中设置断点来查看是否触发了该事件吗?您是否在FormLoad 或Form 构造函数中添加了timer.Tick += Timer_Tick;
  • 很难说哪里出了问题,尤其是那些外部代码
猜你喜欢
  • 1970-01-01
  • 2011-05-24
  • 1970-01-01
  • 2013-09-16
  • 1970-01-01
  • 2012-07-08
  • 2015-05-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多