如何在单击pictureBox时将鼠标光标坐标转换为屏幕相对鼠标光标坐标?

时间:2015-07-06 03:39:45

标签: c# .net winforms

在我的程序中,我添加了这段代码,所以当我在屏幕上移动鼠标时,我会实时获得鼠标光标坐标:

Form1加载:

private void Form1_Load(object sender, EventArgs e)
        {
            System.Windows.Forms.Timer t1 = new System.Windows.Forms.Timer();
            t1.Interval = 50;
            t1.Tick += new EventHandler(timer1_Tick);
            t1.Enabled = true;;
        }

然后获取鼠标位置的方法:

public static Point GetMousePosition()
        {
            var position = System.Windows.Forms.Cursor.Position;
            return new Point(position.X, position.Y);
        }

然后是timer1 tick事件:

private void timer1_Tick(object sender, EventArgs e)
        {
            label1.Text = string.Format("X={0}, Y={1}", GetMousePosition().X, GetMousePosition().Y);
        }

然后我运行了一些应用程序并将鼠标移动到应用程序窗口所在的屏幕上的特定位置,我找到了这个坐标:

358,913

现在我在我的程序中有一个listBox,每个项目都有应用程序截图。如果我在BATTLEFIELD 3区域点击pictureBox,例如本例,我会根据pictureBox区域获得鼠标光标坐标。

Screenshots

所以我做了:

    Point screenCoordinates;
    Point pictureBoxSnapCoordinates;
    private void pictureBoxSnap_MouseDown(object sender, MouseEventArgs e)
    {
        screenCoordinates = pictureBoxSnap.PointToScreen(e.Location);
        pictureBoxSnapCoordinates = e.Location;
    }

现在当我点击图片框中的相同位置时,我找到了坐标358,913,但是在pictureBox上,结果是:

screenCoordinates 435,724

pictureBoxSnapCoordinates 23,423

screenCoordinates与我在鼠标移动时找到的坐标相同358,913它甚至没有关闭。 358,913和437,724之间存在很大差异

2 个答案:

答案 0 :(得分:1)

e.Location相对于Control's左上角。如果您想使用e.Location获取屏幕坐标,则必须先执行pictureBoxSnap.PointToScreen(Point.Empty);,然后按e.Location进行偏移。

此外,Cursor.Position会返回Point个对象,因此new Point(...) 会更少。

答案 1 :(得分:0)

如果您要处理图像,并且需要与鼠标进行交互,并且执行与偏移,滚动等有关的任何任务,那么我必须添加,我建议您使用该库,它是开源的,并且有很多示例和对您有帮助的方法

https://github.com/cyotek/Cyotek.Windows.Forms.ImageBox