如何判断鼠标指针是否悬停在桌面屏幕上?

8
我正在尝试获取鼠标光标是否悬停在桌面屏幕上。以下是我的代码:
    [DllImport("user32.dll")]
    public static extern bool GetCursorPos(out Point lpPoint);

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

    [DllImport("user32.dll", SetLastError = false)]
    public static extern IntPtr GetDesktopWindow();

    public static bool IsMouseOverDesktop()
    {
        Point mouseCursor;
        GetCursorPos(out mouseCursor);
        return WindowFromPoint(mouseCursor) == GetDesktopWindow();
    }

但是它并不起作用。当鼠标光标位于桌面上时,WindowFromPoint和GetDesktopWindow将返回不同的值。

5
桌面窗口可能不是您所想的那样。桌面窗口是最上方的窗口,它不是explorer创建并包含图标的窗口,我猜想您想确定鼠标是否悬停在该窗口上的实际窗口是另一个。 - Damien_The_Unbeliever
也许这可以帮助您:https://dev59.com/Jmox5IYBdhLWcg3wbDok - DonBoitnott
1
我认为说它是最顶层的并不正确(虽然我可能错了)。更准确的说法是它是所有窗口的父级。我建议打开Spy++,找出WindowFromPoint给你的窗口,然后从那里开始。 - Mike Cheel
1个回答

1
现在,使用我的想法,您可以像这样解决您的问题:
在表单代码中使用此方法。
public bool IsMouseOverDesktop()
{
 bool IsMouseOverDesktop = false;
 if ((Cursor.Position.X > this.Location.X) && ((Cursor.Position.X - this.Location.X) < this.Width) && (Cursor.Position.Y > this.Location.Y) && ((Cursor.Position.Y - this.Location.Y) < this.Height))
  IsMouseOverDesktop = false;
 else
  IsMouseOverDesktop = true;
 return IsMouseOverDesktop;
}

然后在事件中调用此方法,并检查鼠标是否悬停在桌面上。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接