代码之家  ›  专栏  ›  技术社区  ›  Daniel Stutzbach Edward Leno

如何判断鼠标是否位于顶级窗口上方?

  •  5
  • Daniel Stutzbach Edward Leno  · 技术社区  · 14 年前

    如何有效地判断鼠标是否位于顶级窗口之上?

    通过“over”,我的意思是鼠标指针在顶级窗口的客户机矩形内。 在我的窗口上鼠标指针的位置没有其他顶级窗口。换句话说,如果用户单击,事件将被发送到我的顶级窗口(或其子窗口之一)。

    我正在使用Windows窗体用C语言编写,但我不介意使用P/Invoke进行Win32调用。

    2 回复  |  直到 14 年前
        1
  •  4
  •   Timwi    14 年前

    WindowFromPoint

    [DllImport("user32.dll")]
    static extern IntPtr WindowFromPoint(POINT Point);
    

    POINT System.Drawing.Point a declaration for POINT that includes an implicit conversion between the two

    GetCursorPos

    [DllImport("user32.dll")]
    static extern bool GetCursorPos(out POINT lpPoint);
    

    GetParent

    [DllImport("user32.dll", ExactSpelling=true, CharSet=CharSet.Auto)]
    public static extern IntPtr GetParent(IntPtr hWnd);
    

        2
  •  2
  •   Hans Passant    14 年前

        private void timer1_Tick(object sender, EventArgs e) {
            var hdl = WindowFromPoint(Control.MousePosition);
            var ctl = Control.FromHandle(hdl);
            if (ctl != null) {
                var rel = ctl.PointToClient(Control.MousePosition);
                if (ctl.ClientRectangle.Contains(rel)) {
                    Console.WriteLine("Found {0}", ctl.Name);
                    return;
                }
            }
            Console.WriteLine("No match");
        }
    
        [System.Runtime.InteropServices.DllImport("user32.dll")]
        private static extern IntPtr WindowFromPoint(Point loc);