gpt4 book ai didi

c# reliable MouseMove (hop) 收藏

转载 作者:太空狗 更新时间:2023-10-29 20:39:49 25 4
gpt4 key购买 nike

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

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

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

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

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

最佳答案

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

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

enter image description here

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

enter image description here

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

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

关于c# reliable MouseMove (hop) 收藏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15606335/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com