С наступающим Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы
Delphi: WinAPI
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.63/40: Рейтинг темы: голосов - 40, средняя оценка - 4.63
eugrita
5 / 6 / 4
Регистрация: 18.11.2009
Сообщений: 544
1

FindWindowEx Button и Edit другого приложения

09.12.2012, 00:12. Просмотров 7539. Ответов 4
Метки нет (Все метки)

Тема довольно заезжена, чего только не наслушался и что FindWindowEx кривой ...
Но вот не могу найти Button или Edit в окне запущенного приложения Delphi
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
var
  Form1: TForm1;
  hNewCaption: String;
  hOldCaption: String;
  ParentWnd: HWND;
  ChildWnd:HWND;
   ParentWnd := FindWindow(nil, PAnsiChar(hOldCaption));
 if(ParentWnd = 0) then   
      begin  ShowMessage('Окно не найдено'); exit; end;
  ChildWnd:=FindWindowEx(ParentWnd, 0,'Button','');
// ChildWnd:=FindWindowEx(ParentWnd, 0,'Edit',nil);
    if(ChildWnd <> 0)  then {возвращает всегда 0!!!!}
      SendMessage(ChildWnd, BM_CLICK, 0, 0)
    else  ShowMessage('But Гў Proba не найден!');
несмотря на то что на некоторых сайтах разбирают и более сложные схемы поиска хэндлов окон элементов управления. Но все основано на возврате хэндла FindWindowEx
а у меня он почему-то возвращает 0 ,несмотря на то что окно приложения находится
ParentWnd <>0 и в тестовом окне Proba есть и TEdit и TButton
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.12.2012, 00:12
Ответы с готовыми решениями:

Как вставить текст в Edit'ы другого приложения?
Не подскажите, как можно в Edit'ы другого приложения (не Delphi'ского) вставить...

Простой вопрос о button,edit,lable и combobox
Привет всем, ещё новичок, у меня такая тема по дельфи: Есть например четыре...

Запуск консольного приложения из другого приложения
Я понимаю, что мой вопрос уже разжеван. Однако точного ответа я пока на него не...

При нажатии на button выполнить свой код + код другого баттона
Как?

Парсинг текста с другого приложения
Привет всем , как спарсить HWID с другого приложения? Например : 1 ехе -...

4
volvo
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
26542 / 17828 / 7051
Регистрация: 22.10.2011
Сообщений: 31,371
Записей в блоге: 6
09.12.2012, 00:24 2
Если приложение написано на Дельфи, то класс кнопки - 'TButton', вот и ищи:
Delphi
1
ChildWnd:=FindWindowEx(ParentWnd, 0,'TButton', nil);
, прекрасно находит кнопку, проверил специально.
1
eugrita
5 / 6 / 4
Регистрация: 18.11.2009
Сообщений: 544
09.12.2012, 07:47  [ТС] 3
и я сделал эти изменения но ничего не получил
ни при вызове из оболочки ни при вызове exe с этим кодом
TEdit в окне Proba единственное и называется Edit1
TButton - тоже и называется But
Delphi
1
2
ChildWnd:=FindWindowEx(ParentWnd, 0,'TEdit',nil);//возвращает 0
ChildWnd:=FindWindowEx(ParentWnd, 0,'TButton',nil);//возвращает 0
Да, кстати как правильно описывать дескрипторы
Delphi
1
 ChildWnd: HWND;
или
Delphi
1
ChildWnd: THandle;
0
volvo
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
26542 / 17828 / 7051
Регистрация: 22.10.2011
Сообщений: 31,371
Записей в блоге: 6
09.12.2012, 11:40 4
Я уж не знаю, что ты там сделал, но вот такой код:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
procedure TForm1.Button18Click(Sender: TObject);
var
  hOldCaption : string;
  ParentWnd, ChildWnd : HWND;
begin
   hOldCaption := 'MyTestForm';
 
   ParentWnd := FindWindow(nil, PChar(hOldCaption));
   if(ParentWnd = 0) then
   begin
      ShowMessage('Окно не найдено'); exit;
   end;
   ChildWnd:=FindWindowEx(ParentWnd, 0,'TButton', nil);
   if ChildWnd <> 0 then
      SendMessage(ChildWnd, BM_CLICK, 0, 0)
   else
      ShowMessage('But в Proba не найден!');
end;
Прекрасно находит и нажимает кнопку вот в таком приложении:

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
unit Unit1;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;
 
type
  TForm1 = class(TForm)
    Button1: TButton;
    Edit1: TEdit;
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
 
var
  Form1: TForm1;
 
implementation
 
{$R *.dfm}
 
procedure TForm1.Button1Click(Sender: TObject);
begin
   Edit1.Text := 'Clicked!!!';
end;
 
procedure TForm1.FormCreate(Sender: TObject);
begin
   Caption := 'MyTestForm';
end;
 
end.
1
eugrita
5 / 6 / 4
Регистрация: 18.11.2009
Сообщений: 544
09.12.2012, 21:07  [ТС] 5
Понял свою ошибку. Вы окно формы искали по Caption
я же по имени приложения. Например, приложение Proba.exe заголовок формы Form1
Cамое интересное как при вводе имени окна Proba так и Form1 findwindow возвращает ненулевой
дескриптор, т.е. якобы окно действительно найдено. Но в 1 случае findwindowex возвращает 0, т.е
не работает а во 2-м случае не 0, и работает.
Вывод. Окно вызываем только по Caption независимо от среды где создано. Так?

Добавлено через 4 часа 29 минут
Есть еще вопрос по этой теме.
Что будет если программа с окном кот.надо обнаружить (Прог.1)будет запущена не на компьютере где
программа Прог2 с FindWindow а на сетевом адресе?
Найдет ли хендл FindWindow ?
0
09.12.2012, 21:07
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.12.2012, 21:07

Чтение массива строк другого приложения
Прошу объяснить, как читаются массивы строк, таблицы из другого процесса....

Доступ к MainMenu и PageControl другого приложения
Здраствуйте! Есть задача управления сторонней программой, кторая также...

Запуск другого приложения с заданными параметрами
Здравствуйте уважаемые знатоки. Допустим на форме имеется Button. Нужно что бы...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru