.NET 4.x Как получить информацию об объекте под курсором мышки? - C#

Узнай цену своей работы

Формулировка задачи:

Собственно появилась интересная задача... Надо получить инфу об объекте под курсором мышки. Юзанье гугла дало что надо заюзать.
Листинг программы
  1. [DllImport("user32.dll")]
  2. public static extern bool GetClientRect(IntPtr hWnd, out RECT lpRect);
  3. [DllImport("user32.dll")]
  4. [return: MarshalAs(UnmanagedType.Bool)]
  5. public static extern bool GetWindowRect(IntPtr hWnd, out RECT lpRect);
  6. [DllImport("user32.dll")]
  7. public static extern bool GetCursorInfo(out CursorInfo pci);
1) но как получить дескриптор окна под курсором? 2) Ок, да же если я его получу, и выдерну потом GetClientRect, то я получу просто размер кнопки например, а не допустим текст в ней а заюзав GetCursorInfo я получу вообще непонятно что... (A handle to the cursor.) ???
WindowFromPoint - вернёт дескриптор окна содержащего указанную точку, а что если одно окно, по верх другого? Или окно развёрнуто, но не в фокусе? Есть более общий метод, типа получить объект под точкой?

Решение задачи: «.NET 4.x Как получить информацию об объекте под курсором мышки?»

textual
Листинг программы
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Runtime.InteropServices;
  5. using System.Text;
  6. using System.Threading;
  7. using System.Threading.Tasks;
  8.  
  9. namespace ConsoleApplication3
  10. {
  11.     class Program
  12.     {
  13.         [StructLayout(LayoutKind.Sequential)]
  14.         public struct RECT
  15.         {
  16.             public Int32 X;
  17.             public Int32 Y;
  18.             public Int32 Width;
  19.             public Int32 Height;
  20.         }
  21.  
  22.  
  23.  
  24.         [DllImport("user32.dll", CharSet = CharSet.Unicode)]
  25.         [return: MarshalAs(UnmanagedType.Bool)]
  26.         public static extern Boolean GetWindowRect(IntPtr hWnd, out RECT lpRect);
  27.  
  28.         [DllImport("user32.dll", CharSet = CharSet.Unicode)]
  29.         public static extern IntPtr WindowFromPoint(Point point);
  30.  
  31.         [DllImport("user32.dll", CharSet = CharSet.Unicode)]
  32.         public static extern IntPtr ChildWindowFromPoint(IntPtr hWndParent, Point point);
  33.         /// <summary>
  34.         /// По дискриптору возвращает название окна
  35.         /// </summary>
  36.         /// <param name="hWnd">Дискриптор окна</param>
  37.         /// <param name="lpString"></param>
  38.         /// <param name="nMaxCount"></param>
  39.         /// <returns></returns>
  40.         [DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Unicode)]
  41.         static extern Int32 GetWindowText(IntPtr hWnd, StringBuilder lpString, Int32 nMaxCount);
  42.         /// <summary>
  43.         /// Получить информацию об окне со следующим заголовком
  44.         /// </summary>
  45.         [DllImport("user32.dll", SetLastError = true)]
  46.         static extern Int32 GetWindowTextLength(IntPtr hWnd);
  47.         static string GetWindowText(IntPtr hWnd)
  48.         {
  49.             int len = GetWindowTextLength(hWnd) + 1;
  50.             StringBuilder sb = new StringBuilder(len);
  51.             len = GetWindowText(hWnd, sb, len);
  52.             return sb.ToString(0, len);
  53.         }
  54.  
  55.         /// <summary>
  56.         /// API для ролучения позиции курсора
  57.         /// </summary>
  58.         /// <param name="lpPoint"></param>
  59.         /// <returns></returns>
  60.  
  61.         [DllImport("user32.dll")]
  62.         static extern Boolean GetCursorPos(out Point lpPoint);
  63.         static void Main()
  64.         {
  65.             Thread.Sleep(5000);
  66.             do
  67.             {
  68.                 Thread.Sleep(3000);
  69.                 Point lpPoint;
  70.                 GetCursorPos(out lpPoint);
  71.                 Console.WriteLine(lpPoint);
  72.                 IntPtr hWnd = WindowFromPoint(lpPoint);
  73.                 var hWnd1 = ChildWindowFromPoint(hWnd, lpPoint);
  74.                 Console.WriteLine("{0}{1}", hWnd, GetWindowText(hWnd));
  75.                 Console.WriteLine("{0}{1}", hWnd1, GetWindowText(hWnd1));
  76.             } while (true);
  77.             Console.ReadLine();
  78.         }
  79.  
  80.     }
  81. }

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

13   голосов , оценка 4.308 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы