我希望鼠标在鼠标按下时冻结(无法移动) 谢谢
答案 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)
您可以通过以下方式伪造窗口的行为:
记住当前光标及其位置。
设置
this.Cursor = Cursors.None;
在指定位置绘制记住的光标,并为所有鼠标处理程序引入canExecute
标记,以便在“假鼠标冻结”期间禁用它们。
答案 4 :(得分:2)
你不能在某处移动鼠标指针吗?你可以在移动时重置它的位置(可能看起来很难看)。
答案 5 :(得分:0)
使用SetWindowsHookEx
设置一个低级别鼠标挂钩,并忽略发送给您指定的{{1>}委托的所有邮件(意味着不要拨打HOOKPROC
)。