7

我正在使用此功能来移动光标。

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

4

2 回答 2

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);
            }
        }
    }
}
于 2013-03-25T01:56:40.377 回答
0

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

    private void Button_MouseMove_1(object sender, MouseEventArgs e)
    {
        SetCursorPos(0, 0);
        e.Handled = true;
    }
于 2013-11-06T10:21:13.650 回答