Dan*_*ach 5 c# winapi winforms
如何有效地判断鼠标是否在顶级窗口上?
通过"over",我的意思是鼠标指针位于顶级窗口的客户端矩形内,并且在鼠标指针位置的窗口上没有其他顶级窗口.换句话说,如果用户点击该事件将被发送到我的顶级窗口(或其子窗口之一).
我使用Windows Forms在C#中编写,但我不介意使用p/invoke来进行Win32调用.
您可以使用 WinAPI 函数WindowFromPoint。它的 C# 签名是:
[DllImport("user32.dll")]
static extern IntPtr WindowFromPoint(POINT Point);
Run Code Online (Sandbox Code Playgroud)
请注意,POINT这里与 不同System.Drawing.Point,但 PInvoke 提供了一个声明,POINT其中包括两者之间的隐式转换。
如果您还不知道鼠标光标位置,请GetCursorPos找到它:
[DllImport("user32.dll")]
static extern bool GetCursorPos(out POINT lpPoint);
Run Code Online (Sandbox Code Playgroud)
但是,WinAPI 将很多东西称为“窗口”:窗口内的控件也是“窗口”。因此,您可能不会获得直观意义上的顶级窗口(您可能会获得单选按钮、面板或其他东西)。您可以迭代地应用该GetParent函数来向上走 GUI 层次结构:
[DllImport("user32.dll", ExactSpelling=true, CharSet=CharSet.Auto)]
public static extern IntPtr GetParent(IntPtr hWnd);
Run Code Online (Sandbox Code Playgroud)
一旦找到没有父窗口的窗口,该窗口将是顶级窗口。由于您最初传入的点属于一个未被另一个窗口覆盖的控件,因此顶级窗口必然是该点所属的那个。