Модераторы: Snowy, bartram, MetalFan, bems, Poseidon, Riply

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Перехват сообщений QIP из окна чата 
V
    Опции темы
Rupor
Дата 4.7.2009, 10:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 41
Регистрация: 4.7.2009

Репутация: нет
Всего: нет



У меня на пк стоит qip. И мне понадобилось записывать весь мой чат в лог. Сколько  уже мучаюсь не выходит.
Делаю вот так:
Код

var
  QIP, PageHandle, TabHandle, childHWND1, childHWND2, childHWND3: THandle;
  lpBuffer: PChar;
begin
  QIP := FindWindow(nil, PChar('Текст окна с чатом'));
  if QIP <> 0 then
  begin
    PageHandle := FindWindowEx(H, 0, 'TInfiPageControl.UnicodeClass', nil);
    if PageHandle <> 0 then
    begin
     TabHandle := FindWindowEx(PageHandle, StrToInt('$00060A4C'), 'TQipTabSheet.UnicodeClass',nil);
     if TabHandle <> 0 then
     begin
        childHWND1 := FindWindowEx(TabHandle, StrToInt('$00060A4C'), 'TMsgPanel.UnicodeClass', nil);
        if childHWND <> 0 then
        begin
childHWND2 := FindWindowEx(TabHandle, StrToInt('$00040A50'), 'TInfuPanel.UnicodeClass', nil);
        if childHWND2 <> 0 then
begin
        childHWND3 := FindWindowEx(TabHandle, StrToInt('$00030A68'), 'TRichView', nil);
        if childHWND3 <> 0 then
lpBuffer := GetMemory(2028);
          try
            SendMessage(childHWND3, WM_GETTEXT, 2048, Integer(lpBuffer));
            RichEdit1.Text := lpBuffer;
          finally
            FreeMemory(lpBuffer);

В чем может быть проблема? Для определения иерархии использую WinSpy++

Это сообщение отредактировал(а) Rupor - 4.7.2009, 10:43
PM MAIL   Вверх
Rupor
Дата 5.7.2009, 14:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 41
Регистрация: 4.7.2009

Репутация: нет
Всего: нет



Неужели никто не знает?  smile 

Это сообщение отредактировал(а) Rupor - 5.7.2009, 14:35
PM MAIL   Вверх
Rrader
  Дата 5.7.2009, 16:12 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Inspired =)
***


Профиль
Группа: Экс. модератор
Сообщений: 1535
Регистрация: 7.5.2005

Репутация: 29
Всего: 191



Цитата

Код

StrToInt('$00060A4C')


Аргументируйте, что это значит? smile 


--------------------
Let's do this quickly!
Rest in peace, Vit!
PM MAIL Skype   Вверх
Keeper89
Дата 5.7.2009, 18:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2580
Регистрация: 26.2.2009

Репутация: 14
Всего: 58



Я уже приводил официальные ссылки о том что события WM_GETEXT и т.д. в RichView не предусмотрены. Вот нашел эту ссылку. 
Посмотрите эту тему, может найдете там еще что-то нужное.

К вопросу Rrader'а присоединяюсь smile

Это сообщение отредактировал(а) Keeper89 - 5.7.2009, 18:33


--------------------
PM MAIL WWW   Вверх
Rupor
Дата 5.7.2009, 20:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 41
Регистрация: 4.7.2009

Репутация: нет
Всего: нет



Там было не соответствие типов. Или может я кривоват. Ну если эти сообщений не предусмотрены, то как по-другому реализовать. Я уже много раз пытался - не получается. Уже руки опустились(( Ссылки ваши буду смотреть. В одной из приведенных вами ссылок, вы сделали копирование текста с RichView через буфер обмена. А как это применить к моему случаю? Мне главное правильно отыскать RichView на окне с чатом QIP.

Это сообщение отредактировал(а) Rupor - 5.7.2009, 20:54
PM MAIL   Вверх
Romikgy
Дата 5.7.2009, 21:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 13
Всего: 146



http://msdn.microsoft.com/en-us/library/bb...28VS.85%29.aspx
+
EM_GETTEXTRANGE
EM_GETLINE
EM_GETLINECOUNT
EM_LINELENGTH
+
EM_STREAMIN
EM_STREAMOUT 


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
Keeper89
Дата 5.7.2009, 22:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2580
Регистрация: 26.2.2009

Репутация: 14
Всего: 58



Вначале дополните условия так, чтобы определять правильно ли бы находите хендлы (в той же ссылке есть пример). Так скорее всего выяснится, что запись с преобразованием не верна.
Также запостите картинку с иерархией классов, может там тоже будут какие неточности.
А на счет получение текста способ по ссылке точно ваш, просто нужно подкорректировать под себя.

З.Ы. Зайдите также на официальный убит компонента, т.к. он очень специфический и многие стандартные сообщения не поддерживает.
З.Ы.2. Ничего конкретного по коду к сожалению написать сейчас не могу, т.к. компьютера под рукой нет.


--------------------
PM MAIL WWW   Вверх
Rupor
Дата 6.7.2009, 08:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 41
Регистрация: 4.7.2009

Репутация: нет
Всего: нет



Вот я выложил отчет о полной иерархии окна с чатом QIP.
http://slil.ru/27814386
PM MAIL   Вверх
Rupor
Дата 6.7.2009, 18:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 41
Регистрация: 4.7.2009

Репутация: нет
Всего: нет



Keeper89, могли бы вы переделать мой код так, чтобы он находил правильно TRichEditView в окне чата? У меня не получается((
PM MAIL   Вверх
Keeper89
Дата 6.7.2009, 21:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2580
Регистрация: 26.2.2009

Репутация: 14
Всего: 58



Rupor, 
как я уже сказал компьютера нет под рукой, если вам не в спешку - подождите числа до 15, думаю тогда у меня будет возможность подправить код.


--------------------
PM MAIL WWW   Вверх
Rupor
Дата 6.7.2009, 23:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 41
Регистрация: 4.7.2009

Репутация: нет
Всего: нет



Не в спешку ;)
PM MAIL   Вверх
Poseidon
Дата 6.7.2009, 23:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphi developer
****


Профиль
Группа: Комодератор
Сообщений: 5273
Регистрация: 4.2.2005
Где: Гомель, Беларусь

Репутация: 10
Всего: 133



Так, стоп, QiP ведь умеет сам вести лог...


--------------------
Если хочешь, что бы что-то работало - используй написанное, 
если хочешь что-то понять - пиши сам...
PM MAIL ICQ   Вверх
Rupor
Дата 7.7.2009, 06:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 41
Регистрация: 4.7.2009

Репутация: нет
Всего: нет



Мне не нужен лог, которой ведет QIP. Мне нужен именно перехват чата моей программой.
PM MAIL   Вверх
Keeper89
Дата 7.7.2009, 09:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2580
Регистрация: 26.2.2009

Репутация: 14
Всего: 58



Во-первых, Квип ведет лог только при наличие соответствующей опции. А во-вторых в текстовом (читаемом) виде это делает только старый квип (2005), у Infium уже не текстовый формат лог-файла.


Это сообщение отредактировал(а) Keeper89 - 7.7.2009, 10:11


--------------------
PM MAIL WWW   Вверх
Keeper89
Дата 14.7.2009, 13:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2580
Регистрация: 26.2.2009

Репутация: 14
Всего: 58



Вот, набросал код, проверил - работает.
* Примечание: текст будет получен только из открытого (текущего) таба с чатом.
Код

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ComCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

uses
  Clipbrd;

{$R *.dfm}


procedure TForm1.Button1Click(Sender: TObject);
var
  TabberHandle, InfiPageHandle, CurrentTabHandle,
  MsgPanelHandle, InfuPanelHandle, RichViewHandle: THandle;
begin
  // Окно чата
  TabberHandle := FindWindow('TfrmTabber.UnicodeClass', Nil);
  if TabberHandle <> 0 then
  begin
    // Страница с табами
    InfiPageHandle := FindWindowEx(TabberHandle, 0,
                                   'TInfiPageControl.UnicodeClass', Nil);
    if InfiPageHandle <> 0 then
    begin
      // Текущий таб
      CurrentTabHandle := FindWindowEx(InfiPageHandle, 0,
                                       'TQipTabSheet.UnicodeClass', Nil);
      if CurrentTabHandle <> 0 then
      begin
        // Панель с чатом на табе
        MsgPanelHandle := FindWindowEx(CurrentTabHandle, 0,
                                       'TMsgPanel.UnicodeClass', Nil);
        if MsgPanelHandle <> 0 then
        begin
          // Панель с ричвью
          InfuPanelHandle := FindWindowEx(MsgPanelHandle, 0,
                                          'TInfuPanel.UnicodeClass', Nil);
          if InfuPanelHandle <> 0 then
          begin
            // Целевой таб
            RichViewHandle := FindWindowEx(InfuPanelHandle, 0,
                                           'TRichView', Nil);
            if RichViewHandle <> 0 then
            begin
              // Копируем текст в буфер обмена, предварительно его очистив
              Clipboard.asText := EmptyStr;
              SendMessage(RichViewHandle, EM_SETSEL, WPARAM(0), LPARAM(-1));
              SendMessage(RichViewHandle, WM_COPY, 0, 0);
              Showmessage(Clipboard.asText);
            end
            else
              Showmessage('Ричвью не найден!')
          end
          else
            Showmessage('Панель с ричвью не найдена!')
        end
        else
          Showmessage('Панель с чатом на табе не найдена!')
      end
      else
        Showmessage('Текущий таб не найден!')
    end
    else
      Showmessage('Табы не найдены!');
  end  
  else
    Showmessage('Окно сообщений не найдено!');
end;

end.

Если будут вопросы, обращайтесь.

Это сообщение отредактировал(а) Keeper89 - 14.7.2009, 13:40


--------------------
PM MAIL WWW   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: WinAPI и системное программирование"
Snowybartram
MetalFanbems
PoseidonRrader
Riply

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Delphi обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • 99% ответов по WinAPI можно найти в MSDN Library, оставшиеся 1% здесь

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, bartram, MetalFan, bems, Poseidon, Rrader, Riply.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: WinAPI и системное программирование | Следующая тема »


 




[ Время генерации скрипта: 0.0604 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.