【问题标题】:how to Make the Mouse Freeze c#如何使鼠标冻结c#
【发布时间】:2011-11-17 07:13:46
【问题描述】:

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

【问题讨论】:

  • 为什么要这样做?
  • 强力胶粘在桌子上。
  • 放在冰箱里
  • 我认为他是用@Grozz 的回答做到的,现在他找不到鼠标来写回复:)
  • 我讨厌抓取/阻止鼠标的应用程序 :(

标签: c# .net


【解决方案1】:

我使用了一个 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;
    }  

【讨论】:

  • 没有测试过,但这正是我的想法。继续重置鼠标位置会产生预期的效果。
  • @Bruno:您也可以通过将剪切矩形设置为 0 来冻结鼠标,我已经更新了答案。
【解决方案2】:

你不能。

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

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

【讨论】:

    【解决方案3】:

    有可能,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 秒,但直到释放鼠标按钮。根据定义,只要用户输入被阻止,就不会收到鼠标按钮的释放。
    • @chicco - 这是正常的 Button 行为,在 MouseUp 上引发 Click 事件。
    【解决方案4】:

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

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

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

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

    【讨论】:

    • 当隐藏的鼠标指针移到其他控件上时,您可能仍会获得其他效果。另一方面,这整个问题可能是个坏主意。
    【解决方案5】:

    你不能把鼠标指针移动到某个地方吗?您可以在移动时重置其位置(可能看起来很难看)。

    【讨论】:

      【解决方案6】:

      使用SetWindowsHookEx 设置低级鼠标钩子并忽略所有发送给您指定的HOOKPROC 代表的消息(意味着不调用CallNextHookEx

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-01-03
        • 2010-09-14
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多