|
#1
|
|||
|
|||
Запись чата ICQ
У меня на ПК стоит ICQ. Ну так вот мне нужно записывать весь мой чат в txt файл. Пробовал так, но не вышло.
Код:
var H, PageHandle, TabHandle, REHandle: THandle; lpBuffer: PChar; begin H := FindWindow(nil, PChar('ICQ')); if H <> 0 then begin PageHandle := FindWindowEx(H, 0, 'SysTabControl32', nil); if PageHandle <> 0 then begin TabHandle := FindWindowEx(PageHandle, 0, '#000605CC',nil); if TabHandle <> 0 then begin REHandle := FindWindowEx(TabHandle, 0, 'RichEdit20A', nil); if REHandle <> 0 then begin lpBuffer := GetMemory(1024); try SendMessage(REHandle, WM_GETTEXT, 1024, Integer(lpBuffer)); RichEdit1.Text := lpBuffer; finally FreeMemory(lpBuffer); end; |
#2
|
||||
|
||||
Так аська-же ведет журнал сообщений. Зачем дублировать?
Жизнь такова какова она есть и больше никакова. Помогаю за спасибо. |
#3
|
|||
|
|||
Тогда, как получить доступ к журналу сообщений. Но желательно осуществить, то, что я хотел в первом посте. Исправьте мой код. А то он не ловит сообщения((
|
#4
|
|||
|
|||
Неужели мне не помогут на этом форуме?
Переписку нужно получать непосредственно с окна ICQ. Последний раз редактировалось Muxa, 25.06.2009 в 19:35. |
#5
|
|||
|
|||
Проверила на окнах класса 'RichEdit20W' и 'Edit' (что было под рукой) — нормально считывается текст. Вы уверены, что получаете верный дескриптор (или что вообще получаете)? Проверьте трассировкой, что процедура вообще доходит до строки с SendMessage. А если всё же доходит до этой строки, то проверьте, что дескриптор принадлежит именно тому окну класса 'RichEdit20A', в котором находится текст.
|
#6
|
|||
|
|||
Код:
var H, PageHandle, TabHandle, REHandle: THandle; lpBuffer: PChar; begin H := FindWindow(nil, PChar('Tanya')); if H <> 0 then begin PageHandle := FindWindowEx(H, 0, '__oxFrame.class__', nil); if PageHandle <> 0 then begin TabHandle := FindWindowEx(PageHandle, 0, '#000205C2',nil); if TabHandle <> 0 then begin REHandle := FindWindowEx(TabHandle, 0, 'Internet Explorer_Server', nil); if REHandle <> 0 then begin lpBuffer := GetMemory(1024); try SendMessage(REHandle, WM_GETTEXT, 1024, Integer(lpBuffer)); RichEdit1.Text := lpBuffer; finally FreeMemory(lpBuffer); end; Последний раз редактировалось Muxa, 26.06.2009 в 09:08. |
#7
|
|||
|
|||
Вы бы лучше попробовали для начала взять дескриптор окна непосредственно, а не с помощью цепочки последовательных FindWindowEx. Например, наводите курсор мыши на желаемое окно с чатом и, например, с помощью какого-нибудь сочетания клавиш вызываете в своей программе функцию WindowFromPoint с параметром Mouse.CursorPos. Функция возвращает вам идентификатор окна. Так вы хотя бы будете уверены, что нужный дескриптор вами получен. А потом уже пробуйте отсылать окну с этим дескриптором сообщение WM_GETTEXT. Если результат будет положительный, вот тогда уже можно будет задумываться об автоматическом получении handle путем FindWindowEx.
Вообще, не понятно: сначала вы привели код с окном класса 'RichEdit20A', а теперь — 'Internet Explorer_Server'. Какое правильно-то? (Я ICQ не пользуюсь, поэтому проверить не могу). Вероятнее всего, окна класса 'Internet Explorer_Server' (в отличие от 'RichEdit') не будут нужным вам образом обрабатывать сообщение WM_GETTEXT. |
#8
|
|||
|
|||
ок, будем пробовать.
P.S. в старых версиях ICQ окно чата было "RichEdit20A", а в новых не знаю. |
#9
|
|||
|
|||
Тот handle, что я получаю при помощи WinSpy++ и с помощью WindowFromPoint сходятся.
Код:
var handle:THandle; begin if (ssCtrl in Shift) and (chr(Key) in [chr(114)]) then begin handle:=WindowFromPoint(Mouse.CursorPos); Label1.Caption:=IntTohex(handle,8); |
#10
|
|||
|
|||
Видимо, не всё так просто. Вот цитата из справки по сообщению WM_GETTEXT:
Цитата:
Я-то пробовала работать с маленькими блоками текста, в этом случае всё замечательно. Когда текста много, то, действительно, сообщение WM_GETTEXT бесполезно. Работать же с сообщением EM_STREAMOUT посложнее будет. P.S. Кстати, для этого еще нужно будет подцепить к проекту модуль RichEdit.pas. |
#11
|
|||
|
|||
Ну я не думаю, что чат ICQ может быть слишком большим. Хотя... У вас есть мысли на счет того, как это считать правильно? В Spy++ который идет в поставке со студией окна отображает по-своему (он удобнее), а WinSpy++ как-то непонятно. Это мое ИМХО. Моя проблема заключается в том, что я не уверен в правильности моего определения класса окна с чатом ICQ.
Последний раз редактировалось Muxa, 26.06.2009 в 15:00. |
#12
|
|||
|
|||
Цитата:
Цитата:
P.S. Ээээ... Беру свои слова о 254 символах обратно. Это я в спешке написала. Ошиблась, конечно!! Просто необходимо, чтобы размер буфера был достаточным, чтобы уместить все содержимое окна... Последний раз редактировалось Nyctos Kasignete, 26.06.2009 в 15:24. |
#13
|
|||
|
|||
Пробовал снова... В общем не получается у меня выудить текст((
Последний раз редактировалось Muxa, 26.06.2009 в 15:35. |
#14
|
|||
|
|||
Ну почему сразу не получается! >_<
У меня же получается. Я использую процедуру следующего вида: Код:
procedure GetTxt(RichEditHandle: HWND); var WndTxt: PChar; begin GetMem(WndTxt, 4096); try SendMessage(RichEditHandle, WM_GETTEXT, 4096, Integer(WndTxt)); Form1.RichEdit1.Text := StrPas(WndTxt); { содержимое пишем в свой RichEdit на форме } finally FreeMem(WndTxt, 4096); end; end; Если я передаю корректный дескриптор окна чужого RichEdit'а, то всё прекрасно работает. Нужно только следить, чтобы память выделялась в достаточном количестве, чтобы вместить содержимое окна RichEdit'а. |
#15
|
|||
|
|||
Nyctos Kasignete, пробовал, но он выдает мне какую-то билеберду(( или я такой криворукий. Во вложении проект. Могли бы вы исправить ошибки? И сделать так, что каждый раз искалось окно ICQ и брался хендл окна чата.
|