![]() |
|
|
#1
|
|||
|
|||
|
У меня на ПК стоит 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 и брался хендл окна чата.
|