.NET 4.x Как получить информацию об объекте под курсором мышки? - C#
Формулировка задачи:
Собственно появилась интересная задача...
Надо получить инфу об объекте под курсором мышки.
Юзанье гугла дало что надо заюзать.
1) но как получить дескриптор окна под курсором?
2) Ок, да же если я его получу, и выдерну потом GetClientRect, то я получу просто размер кнопки например, а не допустим текст в ней
а заюзав GetCursorInfo я получу вообще непонятно что... (A handle to the cursor.) ???
[DllImport("user32.dll")] public static extern bool GetClientRect(IntPtr hWnd, out RECT lpRect); [DllImport("user32.dll")] [return: MarshalAs(UnmanagedType.Bool)] public static extern bool GetWindowRect(IntPtr hWnd, out RECT lpRect); [DllImport("user32.dll")] public static extern bool GetCursorInfo(out CursorInfo pci);
WindowFromPoint - вернёт дескриптор окна содержащего указанную точку, а что если одно окно, по верх другого?
Или окно развёрнуто, но не в фокусе? Есть более общий метод, типа получить объект под точкой?
Решение задачи: «.NET 4.x Как получить информацию об объекте под курсором мышки?»
textual
Листинг программы
using System; using System.Collections.Generic; using System.Linq; using System.Runtime.InteropServices; using System.Text; using System.Threading; using System.Threading.Tasks; namespace ConsoleApplication3 { class Program { [StructLayout(LayoutKind.Sequential)] public struct RECT { public Int32 X; public Int32 Y; public Int32 Width; public Int32 Height; } [DllImport("user32.dll", CharSet = CharSet.Unicode)] [return: MarshalAs(UnmanagedType.Bool)] public static extern Boolean GetWindowRect(IntPtr hWnd, out RECT lpRect); [DllImport("user32.dll", CharSet = CharSet.Unicode)] public static extern IntPtr WindowFromPoint(Point point); [DllImport("user32.dll", CharSet = CharSet.Unicode)] public static extern IntPtr ChildWindowFromPoint(IntPtr hWndParent, Point point); /// <summary> /// По дискриптору возвращает название окна /// </summary> /// <param name="hWnd">Дискриптор окна</param> /// <param name="lpString"></param> /// <param name="nMaxCount"></param> /// <returns></returns> [DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Unicode)] static extern Int32 GetWindowText(IntPtr hWnd, StringBuilder lpString, Int32 nMaxCount); /// <summary> /// Получить информацию об окне со следующим заголовком /// </summary> [DllImport("user32.dll", SetLastError = true)] static extern Int32 GetWindowTextLength(IntPtr hWnd); static string GetWindowText(IntPtr hWnd) { int len = GetWindowTextLength(hWnd) + 1; StringBuilder sb = new StringBuilder(len); len = GetWindowText(hWnd, sb, len); return sb.ToString(0, len); } /// <summary> /// API для ролучения позиции курсора /// </summary> /// <param name="lpPoint"></param> /// <returns></returns> [DllImport("user32.dll")] static extern Boolean GetCursorPos(out Point lpPoint); static void Main() { Thread.Sleep(5000); do { Thread.Sleep(3000); Point lpPoint; GetCursorPos(out lpPoint); Console.WriteLine(lpPoint); IntPtr hWnd = WindowFromPoint(lpPoint); var hWnd1 = ChildWindowFromPoint(hWnd, lpPoint); Console.WriteLine("{0}{1}", hWnd, GetWindowText(hWnd)); Console.WriteLine("{0}{1}", hWnd1, GetWindowText(hWnd1)); } while (true); Console.ReadLine(); } } }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д