WinAPI: Как определить по Wnd что это именно EDIT?
От: itlab Россия  
Дата: 30.01.19 18:27
Оценка:
Получается, что класс окна может быть любой.
Как бы проверить, что этот элемент на форме именно EDIT (поле для ввода текста), а не что то другое?
Спасибо.
Re: WinAPI: Как определить по Wnd что это именно EDIT?
От: Евгений Музыченко Франция https://software.muzychenko.net/ru
Дата: 31.01.19 08:45
Оценка:
Здравствуйте, itlab, Вы писали:

I>Получается, что класс окна может быть любой.

I>Как бы проверить, что этот элемент на форме именно EDIT (поле для ввода текста)

У стандартного Edit Control имя класса — "EDIT", и никакое другое. А вот если Вы хотите программно определять любые поля ввода (в том числе и самодельные) — придется или создавать базу данных признаков, или извращаться (например, с отслеживанием изменения формы курсора, но это не даст гарантии).
Re[2]: WinAPI: Как определить по Wnd что это именно EDIT?
От: itlab Россия  
Дата: 31.01.19 10:24
Оценка:
Здравствуйте, Евгений Музыченко, Вы писали:

ЕМ>Здравствуйте, itlab, Вы писали:


I>>Получается, что класс окна может быть любой.

I>>Как бы проверить, что этот элемент на форме именно EDIT (поле для ввода текста)

ЕМ>У стандартного Edit Control имя класса — "EDIT", и никакое другое. А вот если Вы хотите программно определять любые поля ввода (в том числе и самодельные) — придется или создавать базу данных признаков, или извращаться (например, с отслеживанием изменения формы курсора, но это не даст гарантии).


На счет EDIT не верно. Имя класса может быть любым, для Delphi это TEdit, например.
Решение нашел такое:
SendMessage(hWnd, EM_GETLINECOUNT, 0, 0) = 1
Re[3]: WinAPI: Как определить по Wnd что это именно EDIT?
От: Евгений Музыченко Франция https://software.muzychenko.net/ru
Дата: 31.01.19 11:28
Оценка:
Здравствуйте, itlab, Вы писали:

I>На счет EDIT не верно. Имя класса может быть любым


У стандартного элемента управления Windows, который называется Edit Control, имя класс всегда EDIT (или Edit, ибо имена классов нечувствительны к регистру). Имя класса однозначно связано с идентификатором типа ATOM, а он, в свою очередь — с оконной функцией класса, которая определяет его функциональность.

I>для Delphi это TEdit, например.


А это уже собственный класс Delphi. Их таких миллион, чуть не в каждой оконной библиотеке свои. Другое дело, что они в основном расширяют Edit, а не заменяют его.

I>Решение нашел такое:

I>SendMessage(hWnd, EM_GETLINECOUNT, 0, 0) = 1

Это будет работать до тех пор, пока оконная функция элемента управления либо транслирует сообщения стандартному классу Edit, либо обрабатывает их так же, как и стандартная. Если кто-то реализовал собственное поле редактирования, и не счет нужным обеспечить его совместимость с Edit, то его оконная функция либо вовсе не поймет кодов сообщений EM_xxx, либо будет интерпретировать их на свой манер. Вопрос лишь в том, как быстро Вы нарветесь на такую реализацию.
Re: WinAPI: Как определить по Wnd что это именно EDIT?
От: Carc Россия https://vk.com/gosha_mazov
Дата: 02.02.19 16:41
Оценка:
Здравствуйте, itlab, Вы писали:


I>Получается, что класс окна может быть любой.

I>Как бы проверить, что этот элемент на форме именно EDIT (поле для ввода текста), а не что то другое?
I>Спасибо.
RealGetWindowClass не поможет? Иногда это работало, более менее в старых Windows для случая надклассинга.

PS: Вот еще у Чена в блоге некоторые пояснения
Aml Pages Home
Отредактировано 02.02.2019 16:43 Carc . Предыдущая версия .
Re[2]: WinAPI: Как определить по Wnd что это именно EDIT?
От: Евгений Музыченко Франция https://software.muzychenko.net/ru
Дата: 03.02.19 16:05
Оценка:
Здравствуйте, Carc, Вы писали:

C>RealGetWindowClass не поможет?


Поможет только в случае элемента, основанного на стандартном Edit. Для элементов, полностью реализованных с нуля (вряд ли таких много, но бывают), не поможет.

Это как с капчей: человек распознает интуитивно, а для машинного распознавания без ИИ никак.
Re[3]: WinAPI: Как определить по Wnd что это именно EDIT?
От: Carc Россия https://vk.com/gosha_mazov
Дата: 03.02.19 16:52
Оценка:
Здравствуйте, Евгений Музыченко, Вы писали:

ЕМ>Здравствуйте, Carc, Вы писали:


C>>RealGetWindowClass не поможет?


ЕМ>Поможет только в случае элемента, основанного на стандартном Edit. Для элементов, полностью реализованных с нуля (вряд ли таких много, но бывают), не поможет.


ЕМ>Это как с капчей: человек распознает интуитивно, а для машинного распознавания без ИИ никак.


Ну это хотя бы частино может помочь…
Второй вариант, если компонент самописный с нуля, но реализует стандартный интерефейс сообщений EDIT, то можно послать ему чего нить вроде EM_GETSEL, передав туда заренее инвалидные параметры вроде DWORD wParam=-25,DWORD lParam=-25.

Если компонент его обработает, и вернет что-то осмысленное, поменяв параметры, да хоть бы и на нули, то можно предположить что он поддерживает интерфейс EDIT. Ну и соответственно в стиле интуиции можно попробовать с ним работать как EDIT.
Aml Pages Home
Re[4]: WinAPI: Как определить по Wnd что это именно EDIT?
От: Евгений Музыченко Франция https://software.muzychenko.net/ru
Дата: 03.02.19 16:54
Оценка:
Здравствуйте, Carc, Вы писали:

C>Если компонент его обработает, и вернет что-то осмысленное


Я ж говорю: универсальный вариант — только на ИИ.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.