Получается, что класс окна может быть любой.
Как бы проверить, что этот элемент на форме именно EDIT (поле для ввода текста), а не что то другое?
Спасибо.
Re: WinAPI: Как определить по Wnd что это именно EDIT?
Здравствуйте, itlab, Вы писали:
I>Получается, что класс окна может быть любой. I>Как бы проверить, что этот элемент на форме именно EDIT (поле для ввода текста)
У стандартного Edit Control имя класса — "EDIT", и никакое другое. А вот если Вы хотите программно определять любые поля ввода (в том числе и самодельные) — придется или создавать базу данных признаков, или извращаться (например, с отслеживанием изменения формы курсора, но это не даст гарантии).
Re[2]: WinAPI: Как определить по Wnd что это именно EDIT?
Здравствуйте, Евгений Музыченко, Вы писали:
ЕМ>Здравствуйте, itlab, Вы писали:
I>>Получается, что класс окна может быть любой. I>>Как бы проверить, что этот элемент на форме именно EDIT (поле для ввода текста)
ЕМ>У стандартного Edit Control имя класса — "EDIT", и никакое другое. А вот если Вы хотите программно определять любые поля ввода (в том числе и самодельные) — придется или создавать базу данных признаков, или извращаться (например, с отслеживанием изменения формы курсора, но это не даст гарантии).
На счет EDIT не верно. Имя класса может быть любым, для Delphi это TEdit, например.
Решение нашел такое:
SendMessage(hWnd, EM_GETLINECOUNT, 0, 0) = 1
Re[3]: WinAPI: Как определить по Wnd что это именно EDIT?
Здравствуйте, 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?
I>Получается, что класс окна может быть любой. I>Как бы проверить, что этот элемент на форме именно EDIT (поле для ввода текста), а не что то другое? I>Спасибо. RealGetWindowClass не поможет? Иногда это работало, более менее в старых Windows для случая надклассинга.
Поможет только в случае элемента, основанного на стандартном Edit. Для элементов, полностью реализованных с нуля (вряд ли таких много, но бывают), не поможет.
Это как с капчей: человек распознает интуитивно, а для машинного распознавания без ИИ никак.
Re[3]: WinAPI: Как определить по Wnd что это именно EDIT?
Здравствуйте, Евгений Музыченко, Вы писали:
ЕМ>Здравствуйте, Carc, Вы писали:
C>>RealGetWindowClass не поможет?
ЕМ>Поможет только в случае элемента, основанного на стандартном Edit. Для элементов, полностью реализованных с нуля (вряд ли таких много, но бывают), не поможет.
ЕМ>Это как с капчей: человек распознает интуитивно, а для машинного распознавания без ИИ никак.
Ну это хотя бы частино может помочь…
Второй вариант, если компонент самописный с нуля, но реализует стандартный интерефейс сообщений EDIT, то можно послать ему чего нить вроде EM_GETSEL, передав туда заренее инвалидные параметры вроде DWORD wParam=-25,DWORD lParam=-25.
Если компонент его обработает, и вернет что-то осмысленное, поменяв параметры, да хоть бы и на нули, то можно предположить что он поддерживает интерфейс EDIT. Ну и соответственно в стиле интуиции можно попробовать с ним работать как EDIT.