sam
sam

Reputation: 59

how to Make the Mouse Freeze c#

i want the mouse to freez (cant move) when mouse down thanks

Upvotes: 4

Views: 5064

Answers (6)

ordag
ordag

Reputation: 2527

Setup a low level mouse hook with SetWindowsHookEx and ignore all messages to the HOOKPROC delegate you specified (means not to call CallNextHookEx).

Upvotes: 0

Bolu
Bolu

Reputation: 8786

I used a tableLayoutPanel for your reference (Just remember to implement the code to the Control that is in the front):

OPTION1: Reset the mouse position:

Define two global variables:

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

Handel MouseDown Event to update 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 to disable/enable move:

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

Reset mousemove while Mouseup

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

OPTION2: Limit mouse clipping rectangle:

Limit it while 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));
        }

Release it after 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;
    }  

Upvotes: 6

Hans Passant
Hans Passant

Reputation: 942020

It's possible, Windows has a dedicated API for it, BlockInput(). Be sure to save all your work when you experiment with it, it is rather effective. You may need to reboot your machine, the thing your user will do when you use it in a program. Here's a sample Windows Forms form that uses it, it needs a button and a timer:

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

Upvotes: 4

atamanroman
atamanroman

Reputation: 11818

Can't you move the mouse pointer somewhere? You could reset its position when moving (which may look ugly).

Upvotes: 2

Grozz
Grozz

Reputation: 8435

You can fake that behavior for your window in the following way:

  1. Remember current cursor and its position.

  2. Set this.Cursor = Cursors.None;

  3. Draw the remembered cursor at specified position and introduce canExecute flag for all your mouse handlers to disable them during "fake mouse freezing".

Upvotes: 3

balexandre
balexandre

Reputation: 75103

You can't.

Mouse acts in the OS Layer, not your app... even if you freeze your app, mouse will be able to run.

You can try to disconnect the mouse driver/port but you do need to ask the user what port the mouse is using as for the OS it's a Input device, just like a pen in a design board and you will not know the one to disconnect.

Upvotes: 4

Related Questions