Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как получить слово выделенное в другом приложении [D6, WinXP]


Страницы:   1 2

leonidus ©   (2005-06-16 11:27:00) 

Подскажите пожалуйста как мне получить из чужого окна зная его хэндл выделенный текст?


Kerk   (2005-06-25 22:36:00) [1]

The EM_GETSEL message retrieves the starting and ending character positions of the current selection in an edit control. You can send this message to either an edit control or a rich edit control.

Syntax

To send this message, call the SendMessage function as follows.
lResult = SendMessage(      // returns LRESULT in lResult
    (HWND) hWndControl,      // handle to destination control
    (UINT) EM_GETSEL,      // message ID
    (WPARAM) wParam,      // = (WPARAM) (LPDWORD) wParam;
    (LPARAM) lParam      // = (LPARAM) (LPDWORD) lParam;
);  

Parameters

wParam
Pointer to a buffer that receives the starting position of the selection. This parameter can be NULL.

lParam
Pointer to a buffer that receives the position of the first nonselected character after the end of the selection. This parameter can be NULL.

Return Value

The return value is a zero-based value with the starting position of the selection in the low-order word and the position of the first character after the last selected character in the high-order word. If either of these values exceeds 65,535, the return value is –1.
It is better to use the values returned in wParam and lParam because they are full 32-bit values.


leonidus   (2005-06-25 22:26:00) [2]

люди, не бросайте, помогите!


leonidus   (2005-06-24 22:15:00) [3]

>а что там такого NikNet написал то? Уж не моя ли тугодумность заставила его нервничать:) ?
И всетаки вопрос остается в силе. Проблема в том, что я с WinAPI очень слабо знаком, но чувтсвую что проблема то тут не очень сложная, помогите пожалуйста.


NikNet   (2005-06-24 20:36:00) [4]

Удалено модератором
Примечание: 3 дня РО за многочисленные наезды


Kerk   (2005-06-24 20:31:00) [5]

Когда кажется, тогда крестятся.. а я астматик... тьфу.. агностик.. потому и не крещусь..


NikNet   (2005-06-24 20:26:00) [6]

Удалено модератором


Kerk   (2005-06-24 20:23:00) [7]

Удалено модератором
Примечание: Offtopic


NikNet   (2005-06-24 20:20:00) [8]

Удалено модератором
Примечание: Оп, дошел дошел до этого сообщения, три дня мало, целый месяц тебе


leonidus   (2005-06-24 19:57:00) [9]

а EM_GETSEL тоже нужно через SendMessage посылать?


ANB   (2005-06-24 16:10:00) [10]


> leonidus ©   (24.06.05 15:58) [17]
- еще раз медленно и 2 раза прочитай

> ANB ©   (24.06.05 14:46) [13]


MS-MEN   (2005-06-24 16:01:00) [11]

А попробуй тогда WM_COPY


leonidus   (2005-06-24 15:58:00) [12]

ок хорошо, вызовем GetText, получим текст (кстати из любых контролов? скажем на окне FireFox`а или IE сработает) а как теперь получить именно выделеный текст?


MS-MEN   (2005-06-24 15:49:00) [13]

ANB ©   (24.06.05 15:25) [15]

Да его не поймешь.


ANB   (2005-06-24 15:25:00) [14]


> MS-MEN ©   (24.06.05 15:12) [14]
- WM_GETTEXT работает не всегда, GetText надежнее. Плюс оба способа вернут не выделенный, а весь текст. Вставка - лучше юзать EM_SETSEL, так как WM_SETTEXT тоже заменит весь текст и опять таки не всегда.


MS-MEN   (2005-06-24 15:12:00) [15]

leonidus ©   (24.06.05 13:55) [12]

Lingvo работает простым образом.

Находит все окна которые относятся к определенному процессу
а затем посылает сообщение WM_GETTEXT переводит WM_SETTEXT.


ANB   (2005-06-24 14:46:00) [16]

Везде. Так Ctrl+C не сэмулируешь. Это только через keybd_event отработает. Есть, наверное, способ и через сообщения, но это надо ИШ ждать.


> мне нужно копирование вообще из всех окно. Так например
> делает Lingvo

А лингво умеет копировать не из edit и memo ?

Если нужно универсально, то только GetText, EM_GETSEL, Copy.
В хелпе есть, как их юзать.


leonidus   (2005-06-24 13:55:00) [17]

> MS-MEN дело в том, что меня интересует копирование не только из окон типа Edit и Memo, мне нужно копирование вообще из всех окно. Так например делает Lingvo, выделил текст, нажал Ctrl+Ins+Ins и получил перевод. Как сделать также?

Пытаюсь сделать так:

getcursorpos(pt);
hWnd:= WindowFromPoint(pt);

PostMessage(hWnd,WM_KEYDOWN,VK_CONTROL,0);
PostMessage(hWnd,WM_KEYDOWN,Ord('C'),0);
PostMessage(hWnd,WM_KEYUP,Ord('C'),0);
PostMessage(hWnd,WM_KEYUP,VK_CONTROL,0);

т.е. принудительно отправить окну под курсором Ctrl+C но ничего не выходит, подскажите пожалуйста где ошибка.


MS-MEN   (2005-06-22 09:29:00) [18]

Система решение задачи такая

Выбираешь Handle родителя (Любое внешние окно) а затем пробегаешь
по всем дочерним окнам Button,Memo1,…  и посылаешь всем одну и туже
команду em_CanUndo если результат   равен 0 то орган (Memo,RichEdit)
поддерживает  команду Undo это говорит о том, что мы попали на
расширенный редактор,  так как Edit и т. п. не поддерживают команду UNDO

затем проверяешь скорее посылаешь
EM_GETSEL их много посмотри в спр. WinAPI
если результат не равен нулю, то заносишь в массив
результат, а также ссылку на это окно.

Вот и все.

Сообщение для получение выделенного текста  -  em_GetSel
Для того, что бы получить все дочерние окна на это есть много примеров.


ANB   (2005-06-22 08:19:00) [19]


> leonidus ©   (22.06.05 07:46) [9]
- замечательно. А теперь опубликуй содержимое переменной NameClass.


leonidus   (2005-06-22 07:46:00) [20]

а примерчик можно?

Получаю хендл и класс:

  Wnd:= WindowFromPoint(pt);
  GetWindowRect( Wnd, Rect );
  GetWindowText( Wnd, buff, SizeOf( buff ) );
  WndText := StrPas( buff );
  GetClassName( Wnd, buff, SizeOf( buff ) );
  NameClass := StrPas( buff );

что дальше?


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо