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

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

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

Собственно появилась интересная задача... Надо получить инфу об объекте под курсором мышки. Юзанье гугла дало что надо заюзать.
        
        [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);
1) но как получить дескриптор окна под курсором? 2) Ок, да же если я его получу, и выдерну потом GetClientRect, то я получу просто размер кнопки например, а не допустим текст в ней а заюзав GetCursorInfo я получу вообще непонятно что... (A handle to the cursor.) ???
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();
        }
 
    }
}

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


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

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

13   голосов , оценка 4.308 из 5
Похожие ответы