我的猜测是,在您想触发事件的区域上方有另一个控件。如果是这样,该控件正在捕获MouseMove事件。
例如,我在左上角的位置0,0添加了一个绿色的200x200面板。如果鼠标移动到面板上,窗体的MouseMove事件将停止捕获鼠标光标位置。在我的form的mouse_move事件中,我设置了窗体的文本以显示鼠标坐标。请注意,当鼠标实际位于0,0时(由于必须单击SnippingTool.exe来获取屏幕截图,因此无法看到我的光标),窗口文本中的坐标仍为200,200。
![enter image description here](https://istack.dev59.com/JIWW8.webp)
为了解决这个问题,在面板的MouseMove事件(或您正在使用的任何控件)中使用与您放置在表单的MouseMove事件中相同的代码。这会导致表单文本中的正确坐标。
![enter image description here](https://istack.dev59.com/zY9Z3.webp)
以下是代码(显然可以重构为单个方法):
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);
}
}
}
}