MouseMove事件没有使用TransparencyKey触发

时间:2014-08-17 03:11:53

标签: c# .net winforms

我正在创建一个简单的应用程序,它在鼠标后面绘制水平线和垂直线。

使用TransparencyKey表单是透明的,并使用Paint事件绘制线条:

private void Form1_Paint(object sender, PaintEventArgs e)
        {
            Pen pen = new Pen(Color.Lime);
            e.Graphics.DrawLine(pen, 0, py, this.Size.Width, py);
            e.Graphics.DrawLine(pen, px, 0, px, this.Size.Height);
        }

private void Form1_MouseMove(object sender, MouseEventArgs e)
        {
            px = e.X; // get cursor X pos
            py = e.Y; // get cursor Y pos
            Invalidate(); // fire Paint event
        }

但只有在鼠标悬停在绘制的线上时才会触发MouseMove事件。如何使表单在​​透明时捕获鼠标事件? (只有鼠标移动,我希望表单仍然点击)

1 个答案:

答案 0 :(得分:0)

正如您可以在这里阅读的那样:http://msdn.microsoft.com/en-us/library/system.windows.forms.form.transparencykey%28v=vs.110%29.aspx - “在窗体的透明区域上执行的任何鼠标操作(例如鼠标点击)都将被传输到透明区域下方的窗口”。实现目标的一种方法是编写自己的方法,它将在循环中检查光标与表单的相对位置,这就是我的意思(它对TransparencyKey有用,调整大小并移动表单):

private void MouseMovedWithTransparency()
{
   Point lastCursorPos = new Point(-1, -1); // Starting point.
   while (this.Visible)
   {
        Point currentCursorPos = Cursor.Position;
        if (this.ContainsFocus && currentCursorPos.X > this.Left && currentCursorPos.X < this.Left + this.Width &&
            currentCursorPos.Y > this.Top && currentCursorPos.Y < this.Top + this.Height)
        {
            if ((currentCursorPos.X != lastCursorPos.X) || (currentCursorPos.Y != lastCursorPos.Y))
            {
                // Do actions as in MouseMoved event.

                // Save the new position, so it won't be triggered, when user doesn't move the cursor.
                lastCursorPos = currentCursorPos;
            }
        }

        Application.DoEvents(); // UI must be kept responsive.
        Thread.Sleep(1);
    }
}

现在你要做的就是从Shown事件中调用这个方法 - this.Visible必须是true,所以这是让它工作的最简单方法。