Вы можете использовать функцию WinAPI WindowFromPoint
. Его подпись на C #:
[DllImport("user32.dll")]
static extern IntPtr WindowFromPoint(POINT Point);
Обратите внимание, что POINT
здесь не то же самое, что System.Drawing.Point
, но PInvoke предоставляет объявление для POINT
, которое включает в себя неявное преобразование между двумя .
Если вы еще не знаете положение курсора мыши, GetCursorPos
находит его:
[DllImport("user32.dll")]
static extern bool GetCursorPos(out POINT lpPoint);
Однако WinAPI называет многие вещи «окнами»: элементы управления внутри окна также являются «окнами». Следовательно, вы можете не получить окно верхнего уровня в интуитивном смысле (вы можете получить переключатель, панель или что-то еще). Вы можете итеративно применять функцию GetParent
, чтобы пройти вверх по иерархии GUI:
[DllImport("user32.dll", ExactSpelling=true, CharSet=CharSet.Auto)]
public static extern IntPtr GetParent(IntPtr hWnd);
Как только вы найдете окно без родителя, это окно будет окном верхнего уровня. Поскольку точка, которую вы изначально передали, принадлежит элементу управления, который не покрыт другим окном, то окно верхнего уровня обязательно должно принадлежать точке.