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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Найти кнопку в чужом приложении, программа не находит кнопку в чужом окне 
V
    Опции темы
pomogite
  Дата 31.10.2010, 16:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Подскажите пожалуйста как найти кнопку "запустить" в приложенной программе?
Мой код не находит =( Хотя WinSpy показывает что это кнопка -
 user posted image

Код

procedure TForm1.Button2Click(Sender: TObject);
var h1,h2:hwnd;
begin
  h1:=0;
  h2:=0;
  h1 := FindWindow (nil, 'Moswar Assistant v1.1.0');
  if h1 <> 0 then
  begin
    h2 :=FindWindowEx(h1, 0, nil, 'Запустить');
    SendMessage(h2, BM_CLICK, 0, 0);
    label1.Caption:=('HWND главного окна - '+inttostr(h1));
    label2.Caption:=('HWND кнопки - '+inttostr(h2));
    if h1=0 then showmessage('Не найдено окно');
    if h2=0 then showmessage('Не найдена кнопка');
    end;
    end;



Это сообщение отредактировал(а) pomogite - 31.10.2010, 16:40

Присоединённый файл ( Кол-во скачиваний: 6 )
Присоединённый файл  ma.rar 93,25 Kb
PM MAIL   Вверх
Rennigth
Дата 1.11.2010, 00:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1708
Регистрация: 21.6.2004
Где: Moscow

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



pomogite
Конечно через одно место ))),  но до кнопки вроде добрался. Пойдет?
Код

const
  C_MAIN_MA_WINDOW_NAME: string = 'Moswar Assistant v1.1.0';
  C_BTN_START_WINDOW_NAME: string = 'Запустить';
  C_BTN_CLASS_ATOM_TYPE: Cardinal = $C321;
  C_PRNT_BTN_CLASS_NAME: string = 'WindowsForms10.Window.8.app.0.33c0d9d';

procedure lEnumWindowsProc(WND: hwnd; lParam: LPARAM); stdcall;
var
  WI: tagWINDOWINFO;
  pBuf: PAnsiChar;
begin
  GetWindowInfo(WND, WI);
  if WI.atomWindowType = C_BTN_CLASS_ATOM_TYPE then
  begin
    pBuf := GetMemory(MAXCHAR);
    try
      SendMessage(WND, WM_GETTEXT, MAXCHAR, Integer(pBuf));
      if pBuf =  C_BTN_START_WINDOW_NAME then
      begin
        if SetActiveWindow(WND) = 0 then
          RaiseLastOSError
        else
          SendMessage(WND, BM_CLICK, 0, 0);
      end;
    finally
      FreeMemory(pBuf);
    end;
  end;
end;

procedure TForm6.Button1Click(Sender: TObject);
var
  hMainMAWnd, hSubBtnWnd, hBtnWnd: HWND;

begin
  hMainMAWnd := FindWindow(nil, PAnsiChar(C_MAIN_MA_WINDOW_NAME));
  if hMainMAWnd <> 0 then
  begin
    hSubBtnWnd := FindWindowEx(hMainMAWnd, 0,
      PAnsiChar(C_PRNT_BTN_CLASS_NAME), nil);
    if hSubBtnWnd <> 0 then
      EnumChildWindows(hMainMAWnd, @lEnumWindowsProc, 0);
  end;
end;



Добавлено через 1 минуту и 52 секунды
Проверку на atomWindowType можно убрать, не к чему, забыл убрать.  smile 


--------------------
(* Honesta mors turpi vita potior *)
PM MAIL ICQ   Вверх
Rennigth
Дата 1.11.2010, 01:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1708
Регистрация: 21.6.2004
Где: Moscow

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



upd))) Без ненужной бредятины  smile 
Код

const
  C_MAIN_MA_WINDOW_NAME: string = 'Moswar Assistant v1.1.0';
  C_BTN_START_WINDOW_NAME: string = 'Запустить';

procedure lEnumWindowsProc(hWND: hwnd; lParam: LPARAM); stdcall;
var
  pBuf: PAnsiChar;
begin
  pBuf := GetMemory(MAXCHAR);
  try
    SendMessage(hWND, WM_GETTEXT, MAXCHAR, Integer(pBuf));
    if pBuf =  C_BTN_START_WINDOW_NAME then
    begin
      SetActiveWindow(hWND);
      SendMessage(hWND, BM_CLICK, 0, 0);
    end;
  finally
    FreeMemory(pBuf);
  end;
end;

procedure TForm6.Button1Click(Sender: TObject);
var
  hMainMAWnd: HWND;
begin
  hMainMAWnd := FindWindow(nil, PAnsiChar(C_MAIN_MA_WINDOW_NAME));
  if hMainMAWnd <> 0 then
    EnumChildWindows(hMainMAWnd, @lEnumWindowsProc, 0);
end;




--------------------
(* Honesta mors turpi vita potior *)
PM MAIL ICQ   Вверх
pomogite
  Дата 1.11.2010, 05:38 (ссылка) |   (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Rennigth
Спасибо вроде всё получилось, не мог бы ты прокомментировать свой код чтобы я разобралась в нём?
PM MAIL   Вверх
Rennigth
Дата 1.11.2010, 11:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1708
Регистрация: 21.6.2004
Где: Moscow

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



pomogite, У кнопки "Запустить" парент это не основное окно которое ты находишь так:
Код

  h1 := FindWindow (nil, 'Moswar Assistant v1.1.0');

а другое окно(что-то вроде панели)  у которого ClassName "'WindowsForms10.Window.8.app.0.33c0d9d'".
т.е. Нужно было найти сначала это окно а на нем уже искать кнопку. Вобщем код должен был быть примерно таким:
Код

const
  C_MAIN_MA_WINDOW_NAME: string = 'Moswar Assistant v1.1.0';
  C_PRNT_BTN_WINDOW_CLASSNAME: string = 'WindowsForms10.Window.8.app.0.33c0d9d';
  C_BTN_START_WINDOW_NAME: string = 'Запустить';

procedure TForm6.Button1Click(Sender: TObject);
var
  hMainMAWnd, hPrntBtnWnd, hBtnWnd: HWND;
begin
  hMainMAWnd := FindWindow(nil, PAnsiChar(C_MAIN_MA_WINDOW_NAME));
  if hMainMAWnd <> 0 then
  begin
    hPrntBtnWnd := FindWindowEx(hMainMAWnd, 0, PAnsiChar(C_PRNT_BTN_WINDOW_CLASSNAME), nil);
    if hPrntBtnWnd <> 0 then
    begin
      hBtnWnd := FindWindowEx(hPrntBtnWnd, 0, nil, PAnsiChar(C_BTN_START_WINDOW_NAME));
      if hBtnWnd <> 0 then
      begin
        SetActiveWindow(hWND);
        SendMessage(hWND, BM_CLICK, 0, 0);
      end;
    end;
  end;
end;

Но у меня (пока не могу понять почему) вот это:
Код

      hBtnWnd := FindWindowEx(hPrntBtnWnd, 0, nil, PAnsiChar(C_BTN_START_WINDOW_NAME));

вызывало отказ в доступе. Может какие-то особенности Win7... так что пришлось перебирать все дочерние окна функцией:
Код

EnumChildWindows

На 2000/XP скорее всего можно и без этого обойтись.   smile 



--------------------
(* Honesta mors turpi vita potior *)
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "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.

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


 




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


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

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