如何使鼠标冻结c#

时间:2010-10-22 11:35:56

标签: c# .net

我希望鼠标在鼠标按下时冻结(无法移动) 谢谢

6 个答案:

答案 0 :(得分:6)

我使用tableLayoutPanel作为参考(只记得将代码实现到前面的Control中):

OPTION1:重置鼠标位置:

定义两个全局变量:

bool mousemove = true;
Point currentp = new Point(0, 0);

Handel MouseDown事件更新mousemove

private void tableLayoutPanel1_MouseDown(object sender, MouseEventArgs e)
{
    int offsetX = (sender as Control).Location.X + this.Location.X;
    int offsetY = (sender as Control).Location.Y + this.Location.Y;
    mousemove = false;
    currentp = new Point(e.X+offsetX, e.Y+offsetY); //or just use Cursor.Position
}

Handel MouseMove禁用/启用移动:

 private void tableLayoutPanel1_MouseMove(object sender, MouseEventArgs e)
    {
        if (!mousemove)
        {
            this.Cursor = new Cursor(Cursor.Current.Handle);
            Cursor.Position = currentp;
        }
    }

在Mouseup

时重置mousemove
private void tableLayoutPanel1_MouseUp(object sender, MouseEventArgs e)
    {
        mousemove = true;
    } 

OPTION2:限制鼠标剪裁矩形:

在MouseDown:

时限制它
private void tableLayoutPanel1_MouseDown(object sender, MouseEventArgs e)
        {            
            this.Cursor = new Cursor(Cursor.Current.Handle);
            Cursor.Position = Cursor.Position;
            Cursor.Clip = new Rectangle(Cursor.Position, new Size(0, 0));
        }

在MouseUp之后释放它:

 private void tableLayoutPanel1_MouseUp(object sender, MouseEventArgs e)
    {
        this.Cursor = new Cursor(Cursor.Current.Handle);
        Cursor.Position = Cursor.Position;
        Cursor.Clip = Screen.PrimaryScreen.Bounds;
    }  

答案 1 :(得分:4)

你不能。

鼠标在操作系统层中起作用,而不是你的应用......即使你冻结你的应用程序,鼠标也能运行。

您可以尝试断开鼠标驱动程序/端口,但是您需要询问用户鼠标使用的端口,操作系统是输入设备,就像设计板上的笔一样,您不会知道一个断开。

答案 2 :(得分:4)

有可能,Windows有一个专门的API,BlockInput()。在试验它时一定要保存所有的工作,这是非常有效的。您可能需要重新启动计算机,这是您的用户在程序中使用它时会执行的操作。这是一个使用它的示例Windows窗体表单,它需要一个按钮和一个计时器:

public partial class Form1 : Form {
    public Form1() {
        InitializeComponent();
        timer1.Interval = 3000;
        timer1.Tick += new EventHandler(timer1_Tick);
        button1.Click += new EventHandler(button1_Click);
    }
    private void button1_Click(object sender, EventArgs e) {
        timer1.Enabled = true;
        BlockInput(true);
    }
    private void timer1_Tick(object sender, EventArgs e) {
        timer1.Enabled = false;
        BlockInput(false);
    }
    [System.Runtime.InteropServices.DllImport("user32.dll")]
    private static extern bool BlockInput(bool block);
}

答案 3 :(得分:3)

您可以通过以下方式伪造窗口的行为:

  1. 记住当前光标及其位置。

  2. 设置 this.Cursor = Cursors.None;

  3. 在指定位置绘制记住的光标,并为所有鼠标处理程序引入canExecute标记,以便在“假鼠标冻结”期间禁用它们。

答案 4 :(得分:2)

你不能在某处移动鼠标指针吗?你可以在移动时重置它的位置(可能看起来很难看)。

答案 5 :(得分:0)

使用SetWindowsHookEx设置一个低级别鼠标挂钩,并忽略发送给您指定的{{1>}委托的所有邮件(意味着不要拨打HOOKPROC