Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 18.01.2017, 20:20   #1
cyberdev
Форумчанин
 
Аватар для cyberdev
 
Регистрация: 10.10.2013
Сообщений: 150
По умолчанию Получение информации из класса стороннего приложения

На сколько возможно получить данные из стороннего приложения, чтобы можно было рисовать в окне и запоминать координаты мыши? Попробовал получить хендел окна и имя его класса, при наведении на него мыши, средствами Делфи 7. Но учитывая, то что Делфи работает криво с Виндовс 8.1 (под управлением которой работает мой ПК), при отладке вылетало AV, поэтому я решил попробовать в RAD Studio 10.1. В RAD получилось практически тоже самое, всё так же вылетает AV, когда я применяю функцию GetClassName. Но без неё всё нормально работает.

Фрагмент кода:

Код:
function GetString(i_p_char: PChar): String;
var
  I: Integer;
begin
  if i_p_char = nil then
  begin
    Result := '';
    Exit;
  end;

  for I := 1 to 256 do
  begin
    if i_p_char^ = #0 then
      Exit;
    Result := Result + i_p_char^;
    Inc(i_p_char);
  end;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
var
  Point: TPoint;
  Handle: HWND;
  class_name, class_text: PChar;
begin
  if GetCursorPos(Point) then
  begin
    Memo1.Lines.Clear();
    Handle := WindowFromPoint(Point);
    Memo1.Lines.Add('Handle: ' + IntToStr(Handle));
    GetClassName(Handle, class_name, 256); // После вызова вылетает AV
    Memo1.Lines.Add('Class Name: ' + GetString(class_name));
    //GetWindowText(Handle, class_text, 256);
    //Memo1.Lines.Add('Class Text: ' + GetString(class_text));
  end;
end;
Убрал GetClassName AV перестало вылетать. Когда добавлял закомментированную GetWindowText, то возникало ещё больше лагов. Почему такие лаги и возможно ли получить доступ к стороннему окну без них?

AV после вызова GetClassName:
Изображения
Тип файла: png av.png (8.2 Кб, 78 просмотров)
Сайт о программировании и трехмерной графике - cybersite.ucoz.net
cyberdev вне форума Ответить с цитированием
Старый 18.01.2017, 20:37   #2
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,515
По умолчанию

чтобы НЕ было AV надо ВЫДЕЛЯТЬ память для буфера И это верно для любого компилятора.
Код:
var
   buff: array [0..256] of char;

  class_name:=Pchar(buff); // или так class_name:=@buff[0];
  а вот теперь уже можно и 
  GetClassName( .... class_name, 256);
а вот удалять(вымарывать) из отладочной информации наиболее существенную инфу (адреса) не есть гуд.
или вы считаете что мы сможем по этим адресам влезть в ваш компьютер и получить секретные данные?

а нам эти адреса могли бы подсказать возможную причину иной раз и даже не глядя на код.
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 18.01.2017 в 20:40.
evg_m на форуме Ответить с цитированием
Старый 18.01.2017, 20:48   #3
cyberdev
Форумчанин
 
Аватар для cyberdev
 
Регистрация: 10.10.2013
Сообщений: 150
По умолчанию

evg_m, большое спасибо за подсказку! Обязательно попробую через массив.

На счёт закрашивания адресов, не хотел обижать никого из коллег, просто решил перестраховаться. Мало ли... Интернет читают самые разные личности.

P.S.: В любом случае массив Char-ов должен помочь.
Сайт о программировании и трехмерной графике - cybersite.ucoz.net
cyberdev вне форума Ответить с цитированием
Старый 19.01.2017, 09:10   #4
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,515
По умолчанию

Цитата:
Когда добавлял закомментированную GetWindowText, то возникало ещё больше лагов.
так для неё справедливо то же самое замечание.
Выделением памяти для записи результата заранее( до вызова GetwindowText) должен озаботиться получатель.
И причина этого проста. Только он(получатель) знает когда эта память ему больше не потребуется и сможет ее освободить.
программа — запись алгоритма на языке понятном транслятору
evg_m на форуме Ответить с цитированием
Старый 19.01.2017, 13:45   #5
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
Сообщение от cyberdev Посмотреть сообщение
На счёт закрашивания адресов, не хотел обижать никого из коллег, просто решил перестраховаться. Мало ли... Интернет читают самые разные личности.
и чем этот адрес может помочь?
он относится лишь к одному процессу, и на одной машине.
а если ж у вас уже есть зараза, ей эти адреса до лампочки.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Скрытый запуск стороннего приложения _ZixeL_ Общие вопросы Delphi 8 19.11.2012 20:22
значение из стороннего приложения Wov Общие вопросы Delphi 4 01.03.2011 00:04
Получение данных из TStringGrid стороннего приложения BeerDrinker Win Api 9 31.01.2011 17:53
Получение HTML кода стороннего сайта SuBwooFer JavaScript, Ajax 1 02.05.2010 22:21
Защита стороннего приложения Mifody Общие вопросы Delphi 1 25.03.2010 13:19