Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Операции с выделенным текстом

7
16 июня 2010 года
@pixo $oft
3.4K / / 20.09.2006
Стоит следующая задача:взять текст из активного в данный момент текстового поля,вставить в него некоторые символы и затем вернуть его обратно.Как это примерно делать,понятно–WM_Copy,операция над текстом,WM_Paste.Тем не менее,есть непонятки

1.Определение типа активного окна:если не редактируемое текстовое поле,то выход,иначе шаг 2.Как?
2.Копирование текста.Поле должно поддерживать Unicode,иначе выход.Как узнать?
3.Модификация текста(в буфере обмена,как я понял).Хотелось бы знать последовательность
4.Вставка текста в то же окно.Тут вроде проще некуда

Окно может быть любого процесса
1
16 июня 2010 года
kot_
7.3K / / 20.01.2000
Цитата:
2.Копирование текста.


проверяйте первые символы.
а от чего вы не верите таки системным компонентам?
Оно вам это надо? :)

7
16 июня 2010 года
@pixo $oft
3.4K / / 20.09.2006
Цитата: kot_
проверяйте первые символы

В смысле?Там же не будет признака юникодовых символов(яю или что-то в этом роде)

Цитата: kot_
а от чего вы не верите таки системным компонентам?
Оно вам это надо? :)

Т.е. не верю?:)
Просто мне туда надо будет вставлять юникодовые символы,и если компонент окажется ANSIшным…думаю,понятно (=

Цитата: kot_
Оно вам это надо? :)

Дык не надо было бы–стал бы я форум своим тварьчеством марать?:)

5
16 июня 2010 года
hardcase
4.5K / / 09.08.2005
Цитата: @pixo $oft

Просто мне туда надо будет вставлять юникодовые символы,и если компонент окажется ANSIшным…думаю,понятно

Windows NT от рождения Юникодный, это просто быдлопрограммеры до сих пор за каким-то фигом пользуются однобайтными кодировками.

5
16 июня 2010 года
hardcase
4.5K / / 09.08.2005
Цитата: @pixo $oft
В смысле?Там же не будет признака юникодовых символов(яю или что-то в этом роде)Т.е. не верю?

Юникодный символ занимает минимум 2 байта в памяти. Делай выводы ;)

7
16 июня 2010 года
@pixo $oft
3.4K / / 20.09.2006
Цитата: hardcase
Юникодный символ занимает минимум 2 байта в памяти

И что?Отсюда никаких выводов не следует(хотя если я так туг,то подскажи,пожалуйста:)).Вот из твоего предыдущего поста вполне можно кое-что изъять

Следовательно,минимум 1 проблема ушла

399
17 июня 2010 года
KIV
432 / / 20.01.2009
А зачем копировать и вставлять текст? На мой взгляд жто плохой вариант. Буфер обменя - для пользователя, а не для программ. К тому же его ещё и сохранять желательно. Пользователю будет неприятно если он нажмён на кнопку на которой не будет никакого указания что она работает с буфером обмена, а он вдруг потеряет то, что скопировал. Почему бы не воспользоваться GetWindowText и SetWindowText? Нормальные элементы управления именно так хранят в себе текст. Эти функции есть и в A и в W вариантах. Я думаю, что если у элемента управления добавить в текст юникодовские символы, а хранится строка в дескрипторе окна по-любому в юникоде, то когда ANSI элемент вызовет GetWindowTextA (когда, например, захочет нарисоваться), то логично будет если эти символы будут сконвертированы в ANSI (английские символы и символы из языка винды отобразяться корректно, а которых нет в ANSI - квадратиками). Но я это не проверял и это только предположение. Если использовать эти функции, то и проблемы с недоступными полями не будет. А вот в случае с WM_COPY и WM_PASTE они будут. Потому что в недоступном поле ни выделить ни скопировать текст не возможно.
9.0K
17 июня 2010 года
grag63
71 / / 23.01.2006
KIV во всем прав, текст конвертируется в ANSI (GetWindowTextA). Но если использовать в вин. 98, то возможны некоторые проблеммы с GetWindowTextW. Так же стоит обратить внимание на функции GetActiveWindow и IsWindowEnabled. А для проверки текста - IsTextUnicode.
1
17 июня 2010 года
kot_
7.3K / / 20.01.2000
Вы бы еще 3.11 вспомнили
8.4K
17 июня 2010 года
z0rch
275 / / 02.09.2008
Цитата: KIV
А зачем копировать и вставлять текст? На мой взгляд жто плохой вариант. Буфер обменя - для пользователя, а не для программ. К тому же его ещё и сохранять желательно. Пользователю будет неприятно если он нажмён на кнопку на которой не будет никакого указания что она работает с буфером обмена, а он вдруг потеряет то, что скопировал.


буфер обмена просто самое легкое решение, для передачи текста между разными приложениями...Т.к. весь процесс обработки занимает 1 секунду, пользователь ничего не заметит...чем не вариант? (надо просто позаботиться об сохранении содержимого буфера) :)

Цитата: KIV
Почему бы не воспользоваться GetWindowText и SetWindowText? Нормальные элементы управления именно так хранят в себе текст. Эти функции есть и в A и в W вариантах.


[QUOTE=MSDN]If the target window is owned by another process and has a caption, GetWindowText retrieves the window caption text. If the window does not have a caption, the return value is a null string...To retrieve the text of a control in another process, send a WM_GETTEXT message directly instead of calling GetWindowText.[/QUOTE]
а вот рассмотреть SendMessage+WM_GETTEXT - это интересный вариант, надо будет попробовать...

7
17 июня 2010 года
@pixo $oft
3.4K / / 20.09.2006
Цитата: kot_
Вы бы еще 3.11 вспомнили

Точно:)

Спасибо за интересные замечания,по поводу буфера обмена вы наверняка правы чуть менее,чем полностью

Но если брать текст(хоть GetWindowText'ом,хоть сообщением),то ведь придётся самому туда символы вставлять,что не есть просто.К тому же,надо получить не весь текст,а именно выделенный

И да,GetActiveWindow,НЯЗ,возвращает дескриптор высокоуровнего окна.А как получить окно,которое в фокусе,и узнать,что оно является текстовым полем(вообще)?

9.0K
18 июня 2010 года
grag63
71 / / 23.01.2006
Цитата: kot_
Вы бы еще 3.11 вспомнили



3.11 давно уже не встречал, а вот с 95-ой попадаются клиенты.
Для получения выделенной части - EM_GETSEL. Есть апи - GetFocus().
Текстовое поле - это класс "EDIT" - GetClassName(мое окно, ...)
Я бы реализовал все это сл. образом
1. получить окно с фокусом hwnd = GetFocus()
2. получить класс окна и если оно текстовое, выполняем сл. опер.
3. получить текст и выделение
4. произвести свои преобразования с полченным текстом (левая часть + вставка + правая часть)
5. передать текст окну и сделать выделение всавки.

Буфер обмена служит для обмена инф. между приложениями через ПОЛЬЗОВАТЕЛЯ, как следствие - нелзя его игнорировать (пользователь занес в буфер необходимую ему инф., и после ваших манипуляций, он просто может их потерять, к пр. 1000$)

8.4K
18 июня 2010 года
z0rch
275 / / 02.09.2008
Цитата: grag63
Буфер обмена служит для обмена инф. между приложениями через ПОЛЬЗОВАТЕЛЯ


не понимаю, где вы увидели запрет на использование буфера программно? зачем тогда в дотнете существует класс System.Windows.Forms.Clipboard? "щоб було"? :)
если единственная боязнь, это

Цитата: grag63
пользователь занес в буфер необходимую ему инф., и после ваших манипуляций, он просто может их потерять, к пр. 1000$

то может просто сто́ит потратить дополнительно немножко времени и гарантировать сохранность содержимого буфера после использования?

основное преимущество использования именно буфера, на мой взгляд: если введен огромный текст, а требуется "подредактировать" (т.е. выделен) маленький кусочек, то мы будем работать именно с этим кусочком, а не со всем текстом.

p.s.

Цитата:
пользователь набрал необходимую ему инф., и после ваших манипуляций со всем текстом, он просто может ее потерять, к пр. 1000$

такой боязни ни у кого нет? ;)

5
18 июня 2010 года
hardcase
4.5K / / 09.08.2005
Цитата: z0rch
не понимаю, где вы увидели запрет на использование буфера программно? зачем тогда в дотнете существует класс System.Windows.Forms.Clipboard? "щоб було"?

System.Windows.Forms.Clipboard нужен для возможности занесения в него данных (и чтения) из собственных контролов. Примером такового контрола может быть текстовый редактор в SharpDevelop.

5
18 июня 2010 года
hardcase
4.5K / / 09.08.2005
Цитата: z0rch
может просто сто́ит потратить дополнительно немножко времени и гарантировать сохранность содержимого буфера после использования?

Это равноценно тому, что не использовать его вовсе: в буфере может быть вообще картинка, когда же используется спец программа для работы с буфером (Ditto, рекомендую очень) это может привести к интересным побочным эффектам.

8.4K
18 июня 2010 года
z0rch
275 / / 02.09.2008
[QUOTE=hardcase]System.Windows.Forms.Clipboard нужен для возможности занесения в него данных (и чтения) из собственных контролов. Примером такового контрола может быть текстовый редактор в SharpDevelop.[/QUOTE]
хм...вот именно, это пример, я бы сказал что он "не только" для этого нужен.

а̶ ̶в̶о̶т̶ ̶с̶п̶е̶ц̶.̶ ̶п̶р̶о̶г̶р̶а̶м̶м̶ы̶ ̶-̶ ̶э̶т̶о̶ ̶с̶о̶г̶л̶а̶с̶е̶н̶,̶ п̶р̶о̶б̶л̶е̶м̶а̶ ̶d̶e̶t̶e̶c̶t̶e̶d̶. :)
8.4K
18 июня 2010 года
z0rch
275 / / 02.09.2008
я скачал ditto, и (со стандартными настройками) в его "Quick Paste" не отражаются мои действия "сохранил буфер - поиспользовал его - восстановил". кроме того, после всех манипуляций без труда извлекаются из буфера по Ctrl+V как текстовые данные, так и графические, т.е. потерь нет.
5
18 июня 2010 года
hardcase
4.5K / / 09.08.2005
Цитата: z0rch
в его "Quick Paste" не отражаются мои действия "сохранил буфер - поиспользовал его - восстановил"

Хм. Ну раз так... Но таки это больше похоже на багу Ditto (у него их хватает :().

8.4K
18 июня 2010 года
z0rch
275 / / 02.09.2008
тогда я вечером попробую еще на парочке подобных утилит потестить, потом расскажу результат :)
14
18 июня 2010 года
Phodopus
3.3K / / 19.06.2008
Класс EDIT не пройдет для всех текстовых окон (например, VCL-ные отпадают сразу)
Скорее всего получится использовать EM_GETSEL (null,null) и WM_GETTTEXT/WM_SETTEXT (GetWindowText() не подходит для стороннего приложения). Узнать unicode ли окно - IsWindowUnicode(). GetFocus() также не подойдет для стороннего приложения, можно попробовать GetGUIThreadInfo().
Вообще было бы хорошо суперклассить EDIT в своей DLL-ке и регистрировать как системный класс...
8.4K
18 июня 2010 года
z0rch
275 / / 02.09.2008
как и обещал, рассказываю.
тестил я некий ClipMatе. если запустить те же действия ("сохранил буфер - поиспользовал его - восстановил"), то ClipMate говорит, что "пытаются скопировать данные, которые уже находятся в буфере, и поэтому изменений в буфере не происходит". Если же после каждого этапа сделать задержку, например вставить вывод MessageBox'a, то ClipMate успевает отреагировать на действия моей программы - на три изменения в буфере обмена.

возможно, в этих двух утилитах, которые я пробовал, стоит слишком большой интервал на таймере проверки изменения содержимого буфера и, возможно, если интервал уменьшить, то моя программа и будет отлавливаться ими, но...но этого ж не произошло :)
399
19 июня 2010 года
KIV
432 / / 20.01.2009
Цитата: Phodopus
GetWindowText() не подходит для стороннего приложения


Разьве? А по-моему как раз GetWindowText получает тнест из чужого окна, а вот WM_GETTEXT вернёт строку в адресное пространство процесса чьё окно. Везде где я видел его использование приходится заботиться о выделении области памяти в чужом процесса, а затем копировании данных оттуда. Проще использовать GetWindowText. И не все окна EDIT, поэтому ориентироваться только на них не надо. Однако EM_GETCURSL и прочие поддерживаются далеко не только EDIT'ами, но и прочими редакторами.

253
19 июня 2010 года
Proger_XP
1.5K / / 07.08.2004
Цитата: KIV
Разьве? А по-моему как раз GetWindowText получает тнест из чужого окна, а вот WM_GETTEXT вернёт строку в адресное пространство процесса чьё окно.


Вообще говоря:

Цитата:
lParam = (LPARAM) lpszText; // address of buffer for text



Так что память ты выделяешь у себя в процессе сам.

Даже больше:

Цитата:

GetWindowText
This function causes a WM_GETTEXT message to be sent to the specified window or control.

14
21 июня 2010 года
Phodopus
3.3K / / 19.06.2008
Цитата: Proger_XP
Вообще говоря:
Так что память ты выделяешь у себя в процессе сам.


KIV говорит не совсем об этом. Дело в том что некоторые оконные сообщения (например common controls) работают исключительно в рамках процесса своего окна. Но сразу скажу что WM_GETTEXT (и SET) весьма нетривиальное и не подчиняющееся этим ограничениям сообщение - оно по особому обрабатывается внутри Windows. За интересностями можете погуглить его + GetWindowsText (где-то была статья на англ.).
ТС: еще есть интересная функция InternalGetWindowText(), в описание не вчитывался но похоже она куда строже и все что надо умеет.

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог