Небольшой вопрос по граббингу текста из стороннего приложени
От: J-son  
Дата: 05.02.10 17:27
Оценка:
Здравствуйте,

Мне нужно получить доступ к тексту, находящемуся в программе управления станком.
Этой программы у меня естественно на компе нет, поэтому я, можно сказать, тренируюсь на кошках))

Я поискал в форуме и нашел такой вот текст
HWND hWndNotepad=NULL,hWndEdit=NULL;
hWndNotepad=::FindWindow("Notepad",NULL);//ищем дескриптор блокнота(родителя для едита)
if(hWndNotepad)
{
  hWndEdit=::FindWindowEx(hWndNotepad,0,"Edit",NULL);//ищем дескриптор едита где вы чето написали
  if(hWndEdit)
  {
    char buf[4096]={0};
    //шлем пламенный привет едиту с просьбой вернуть его содержимое
    ::SendMessage(hWndEdit,WM_GETTEXT,sizeof(buf),(LPARAM)buf);//сработает и в чужом приложении(но на незащищенных окнах)
    ::MessageBox(0,buf,0,0);
  }
}

С блокнотом это сработало. Решил попробовать на Ворде
Возникли следеующие проблемы:

1. В Spy++ не отображается окно с самим текстом, который я ввел в ворд (или не отображается просто текст),
хотя остальные окна (касающиеся управления) отображаются. Это означает, что оно заблокировано?
2. И если у какой-то программы несколько окон с типом, например, "Edit", то как открыть нужное?
У меня такая идея, что надо получить список всех дочерних окон, а потом их просмотреть.
Как получить список, в этом случае?

06.02.10 15:15: Перенесено модератором из 'C/C++' — Кодт. Да, и форматирование сделал.
Re: Небольшой вопрос по граббингу текста из стороннего прило
От: A.J. Россия CintaNotes
Дата: 05.02.10 17:56
Оценка: 3 (1)
Здравствуйте, J-son, Вы писали:

JS>1. В Spy++ не отображается окно с самим текстом, который я ввел в ворд (или не отображается просто текст),

JS>хотя остальные окна (касающиеся управления) отображаются. Это означает, что оно заблокировано?

Возможно это не окно на самом деле.
На WM_GETTEXT будут реагировать далеко не все окна, и надо прежде всего посмотреть, какого типа окно в том приложении.
Если это стандартный Edit контрол — то все ок. Если нет, то есть еще способ — эмулировать нажатие Ctrl+C
в окне и потом считывать текст из буфера обмена.

JS>2. И если у какой-то программы несколько окон с типом, например, "Edit", то как открыть нужное?

JS>У меня такая идея, что надо получить список всех дочерних окон, а потом их просмотреть.
JS>Как получить список, в этом случае?

EnumChildWindows
Re[2]: Небольшой вопрос по граббингу текста из стороннего пр
От: J-son  
Дата: 05.02.10 18:32
Оценка:
Здравствуйте, A.J., Вы писали:

AJ>Здравствуйте, J-son, Вы писали:


JS>>1. В Spy++ не отображается окно с самим текстом, который я ввел в ворд (или не отображается просто текст),

JS>>хотя остальные окна (касающиеся управления) отображаются. Это означает, что оно заблокировано?

AJ>Возможно это не окно на самом деле.

AJ>На WM_GETTEXT будут реагировать далеко не все окна, и надо прежде всего посмотреть, какого типа окно в том приложении.
AJ>Если это стандартный Edit контрол — то все ок. Если нет, то есть еще способ — эмулировать нажатие Ctrl+C
AJ>в окне и потом считывать текст из буфера обмена.

JS>>2. И если у какой-то программы несколько окон с типом, например, "Edit", то как открыть нужное?

JS>>У меня такая идея, что надо получить список всех дочерних окон, а потом их просмотреть.
JS>>Как получить список, в этом случае?

AJ>EnumChildWindows


Хорошо, спасибо

Возможно вы немного не поняли, я имел ввиду, что я именно в Spy++ не вижу вордовского окна, в который собственно вводят текст. Хотя вижу окна с названием шрифта, его размером и тд

А по поводу копирования — идея хорошая, но сначала надо эту испробовать
А как выполнить выделение текста в этом случае, он там не маленький
Например в блокноте можно три раза кликнуть мышкой, а вот в студии такой вариант не прокатил.
Re[3]: Небольшой вопрос по граббингу текста из стороннего пр
От: J-son  
Дата: 05.02.10 18:48
Оценка:
Здравствуйте, J-son, Вы писали:

JS>Здравствуйте, A.J., Вы писали:


AJ>>Здравствуйте, J-son, Вы писали:


JS>>>1. В Spy++ не отображается окно с самим текстом, который я ввел в ворд (или не отображается просто текст),

JS>>>хотя остальные окна (касающиеся управления) отображаются. Это означает, что оно заблокировано?

AJ>>Возможно это не окно на самом деле.

AJ>>На WM_GETTEXT будут реагировать далеко не все окна, и надо прежде всего посмотреть, какого типа окно в том приложении.
AJ>>Если это стандартный Edit контрол — то все ок. Если нет, то есть еще способ — эмулировать нажатие Ctrl+C
AJ>>в окне и потом считывать текст из буфера обмена.

JS>>>2. И если у какой-то программы несколько окон с типом, например, "Edit", то как открыть нужное?

JS>>>У меня такая идея, что надо получить список всех дочерних окон, а потом их просмотреть.
JS>>>Как получить список, в этом случае?

AJ>>EnumChildWindows


JS>Хорошо, спасибо


JS>Возможно вы немного не поняли, я имел ввиду, что я именно в Spy++ не вижу вордовского окна, в который собственно вводят текст. Хотя вижу окна с названием шрифта, его размером и тд


JS>А по поводу копирования — идея хорошая, но сначала надо эту испробовать

JS>А как выполнить выделение текста в этом случае, он там не маленький
JS>Например в блокноте можно три раза кликнуть мышкой, а вот в студии такой вариант не прокатил.

Я разобрался, выделение можно сделать с помощью горячих клавиш
Re[3]: Небольшой вопрос по граббингу текста из стороннего пр
От: CEMb  
Дата: 08.02.10 08:24
Оценка: 3 (1) +1
Здравствуйте, J-son, Вы писали:

JS>Возможно вы немного не поняли, я имел ввиду, что я именно в Spy++ не вижу вордовского окна, в который собственно вводят текст. Хотя вижу окна с названием шрифта, его размером и тд


Потому что нет окна с вводом текста, в обычном его понимании.

В Блокноте — стандартный richedit, с которым можно работать стандартными способами.
В ворде — своё окошко, со своей отрисовкой, со своим способом хранения текста где-то там у себя в памяти. Работать через wm_gettext с ним не получится. Оно простирается от левого верхнего угла и до скроллбаров

Получить текст из _любого_ окна — не получится. Из ворда это лучше делать через средства COM.
Re: Небольшой вопрос по граббингу текста из стороннего прило
От: Qa1888  
Дата: 08.02.10 10:13
Оценка: 3 (1)
Все зависит от окна:

если обычное, то сообщение WM_GETTEXT
если windowless controls (те у которых нет своего HWND), то через IAccessibility можно получить
если там окно эксплорера то можно через DOM модель работать
еще можно через ctrl+c копировать

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

JS>1. В Spy++ не отображается окно с самим текстом, который я ввел в ворд (или не отображается просто текст),

JS>хотя остальные окна (касающиеся управления) отображаются. Это означает, что оно заблокировано?
JS>2. И если у какой-то программы несколько окон с типом, например, "Edit", то как открыть нужное?
JS>У меня такая идея, что надо получить список всех дочерних окон, а потом их просмотреть.
JS>Как получить список, в этом случае?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.