【问题标题】:c# reliable MouseMove (hop)时间:2019-04-10 标签:c#reliable MouseMove(hop)
【发布时间】:2013-03-25 01:33:20
【问题描述】:

我正在使用这个函数来移动光标。

[DllImport("user32.dll")]
static extern bool SetCursorPos(int X, int Y);

当我使用热键触发它时,光标将移动到正确的坐标,下次我移动鼠标时,它会从那个位置继续。按预期工作。

但是我需要在 MouseMove 事件期间触发 SetCursorPos。如果用户将鼠标移动到某个区域,我希望它跳到另一个地方并从那里继续。但现在它会跳到目的地,然后立即跳回(90% 的时间)。我怎样才能避免这种行为?

编辑:我决定通过在 1 x 1 px 正方形中为 1 个 mousemove 事件剪辑光标来解决这个问题。 Cursor.Clip(MousePosition, new Rectangle(1, 1));

【问题讨论】:

  • 请发布您的 MouseMove 事件处理程序代码。
  • 我实际上只是在调用该函数,在 MouseMove 事件中没有其他任何内容。
  • @user1340531:还是发帖吧?
  • 这往往会受到“如果两个程序这样做会怎样?”的影响。困境。就像您和获取鼠标移动消息的程序一样。用户总是输。

标签: c# mousemove


【解决方案1】:

我的猜测是,在您要触发事件的区域中,表单顶部还有另一个控件。如果是这样,则该控件正在捕获MouseMove 事件。

例如,这里我在左上角的位置 0、0 添加了一个绿色的 200x200 面板。如果鼠标在面板上移动,表单的MouseMove 事件将停止捕获鼠标光标位置。在我的表单的mouse_move 事件中,我将表单的文本设置为显示鼠标坐标。请注意,当鼠标实际位于 0、0 时,Window Text 中的坐标仍为 200、200(由于必须单击 SnippingTool.exe 来获取屏幕截图,因此无法看到我的光标)。

要解决此问题,请在面板的 MouseMove 事件(或您正在使用的任何控件)中使用您在表单的 MouseMove 事件中放置的相同代码。这会在表单的文本中产生正确的坐标。

这是代码(这显然可以重构为一个方法):

public partial class Form1 : Form
{
    [DllImport("user32.dll")]
    static extern bool SetCursorPos(int X, int Y);

    public Form1()
    {
        InitializeComponent();
    }

    private void Form1_MouseMove(object sender, MouseEventArgs e)
    {
        this.Text = string.Format("X: {0}, Y: {1}", e.X, e.Y);

        if (e.X >= 0 && e.X <= 200)
        {
            if (e.Y >= 0 && e.Y <= 200)
            {
                SetCursorPos(500, 500);
            }
        }
    }

    private void panel1_MouseMove(object sender, MouseEventArgs e)
    {
        this.Text = string.Format("X: {0}, Y: {1}", e.X, e.Y);

        if (e.X >= 0 && e.X <= 200)
        {
            if (e.Y >= 0 && e.Y <= 200)
            {
                SetCursorPos(500, 500);
            }
        }
    }
}

【讨论】:

  • 我的 MouseMove 事件实际上是全局的,无论我悬停什么,只要光标移动,它都会触发。
  • @user1340531 正如其他评论者所说,您需要将该代码添加到您的问题中。
  • 主要是因为没有“全局”MouseMove 事件,除非您安装了全局挂钩。
【解决方案2】:

用这么少的信息很难说(也许您的 GUI 屏幕截图会有所帮助)。 你可以试试:

    private void Button_MouseMove_1(object sender, MouseEventArgs e)
    {
        SetCursorPos(0, 0);
        e.Handled = true;
    }

【讨论】:

    猜你喜欢
    • 2016-04-19
    • 2022-01-16
    • 2018-07-04
    • 2019-06-02
    • 1970-01-01
    • 1970-01-01
    • 2013-05-26
    • 2015-02-10
    • 2013-06-03
    相关资源
    最近更新 更多