我的猜测是,在您要触发事件的区域中,表单顶部还有另一个控件。如果是这样,则控件正在捕获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);
}
}
}
}