【发布时间】:2011-11-17 07:13:46
【问题描述】:
我希望鼠标在鼠标按下时冻结(无法移动) 谢谢
【问题讨论】:
-
为什么要这样做?
-
强力胶粘在桌子上。
-
放在冰箱里
-
我认为他是用@Grozz 的回答做到的,现在他找不到鼠标来写回复:)
-
我讨厌抓取/阻止鼠标的应用程序 :(
我希望鼠标在鼠标按下时冻结(无法移动) 谢谢
【问题讨论】:
我使用了一个 tableLayoutPanel 供您参考(请记住将代码实现到前面的 Control):
选项1:重置鼠标位置:
定义两个全局变量:
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;
}
【讨论】:
你不能。
鼠标作用于操作系统层,而不是您的应用程序...即使您冻结应用程序,鼠标也能运行。
您可以尝试断开鼠标驱动程序/端口,但您确实需要询问用户鼠标正在使用哪个端口,因为对于操作系统,它是输入设备,就像设计板上的笔一样,您不会知道一个断开连接。
【讨论】:
有可能,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);
}
【讨论】:
您可以通过以下方式为您的窗口伪造该行为:
记住当前光标及其位置。
设置
this.Cursor = Cursors.None;
在指定位置绘制记忆光标,并为所有鼠标处理程序引入canExecute标志,以在“假鼠标冻结”期间禁用它们。
【讨论】:
你不能把鼠标指针移动到某个地方吗?您可以在移动时重置其位置(可能看起来很难看)。
【讨论】:
使用SetWindowsHookEx 设置低级鼠标钩子并忽略所有发送给您指定的HOOKPROC 代表的消息(意味着不调用CallNextHookEx)。
【讨论】: