Форум программистов, компьютерный форум, киберфорум
Наши страницы
C# для начинающих
Войти
Регистрация
Восстановить пароль
 
Kill100
420 / 286 / 81
Регистрация: 11.12.2010
Сообщений: 1,200
Завершенные тесты: 1
1

Как получить информацию об объекте под курсором мышки?

07.10.2016, 11:36. Просмотров 384. Ответов 3
Метки нет (Все метки)

Собственно появилась интересная задача...
Надо получить инфу об объекте под курсором мышки.
Юзанье гугла дало что надо заюзать.
C#
1
2
3
4
5
6
7
8
9
10
        
        [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.) ???

Добавлено через 19 минут
WindowFromPoint - вернёт дескриптор окна содержащего указанную точку, а что если одно окно, по верх другого?
Или окно развёрнуто, но не в фокусе? Есть более общий метод, типа получить объект под точкой?
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.10.2016, 11:36
Ответы с готовыми решениями:

Получить цвет точки формы под курсором в формате RGB
Передвигая мышь над битмапом или графиксом - нужно постоянно видеть справа от...

Как определить цвет под курсором
как определить?

Как считать символ под курсором
Console.SetCursorPosition (3, 5); как проверить является ли символ '#'? ...

Как узнать цвет пикселя под курсором?
Здравствуйте. Как на C# узнать цвет пикселя под курсором? И еще можно ли как...

Как получить информацию из ссылки?
Например у меня есть ссылка на показ ip адресса: http://ip.portscan.ru/...

3
ViterAlex
6822 / 3797 / 1552
Регистрация: 11.02.2013
Сообщений: 8,344
Завершенные тесты: 3
07.10.2016, 16:13 2
Цитата Сообщение от Kill100 Посмотреть сообщение
что если одно окно, по верх другого?
Вернёт то, которое в данный момент выше
Цитата Сообщение от Kill100 Посмотреть сообщение
Ок, да же если я его получу, и выдерну потом GetClientRect, то я получу просто размер кнопки например
Чтобы получить кнопку, нужно использовать ChildWindowFromPoint и потом GetWindowText
1
Kill100
420 / 286 / 81
Регистрация: 11.12.2010
Сообщений: 1,200
Завершенные тесты: 1
07.10.2016, 22:04  [ТС] 3
ChildWindowFromPoint хм, а у неё начало координат это область родительского окна?

как то оно странно работает...
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
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();
        }
 
    }
}
Добавлено через 2 минуты
И еще вопрос, возможно ли узнать тип объекта, окно или кнопка или текстовое поле
0
ViterAlex
6822 / 3797 / 1552
Регистрация: 11.02.2013
Сообщений: 8,344
Завершенные тесты: 3
07.10.2016, 22:41 4
Цитата Сообщение от Kill100 Посмотреть сообщение
а у неё начало координат это область родительского окна?
Если ты полез в функции API, то стоит читать справку. Да, координаты от родительского окна считаются.
Цитата Сообщение от Kill100 Посмотреть сообщение
возможно ли узнать тип объекта, окно или кнопка или текстовое поле
Возможно. GetClassName
1
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.10.2016, 22:41

Как получить информацию о файле?
Как получить информацию о файле с помощью C#?

Как получить информацию о физических дисках на ПК?
Есть необходимость получить информацию о ФИЗИЧЕСКИХ дисках на компе. Для...

Как получить информацию от API на Azure?
Всем привет. Пытаюсь получить информацию от api на azure и ничего не выходит....


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru