Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 3 956

/ вопрос открыт /

Здравствуйте!

Пмомгите решить проблему.
Я ищу окно
FindWindow(nil, 'Caption');
Нахожу. И вот как мне теперь перебрать элементы на этом окне?
Т.е. определить кто есть Edit, кто BUtton и соответственно, либо вписать текст, либо нажать кнопку.
И вообще, возможно ли это. Если да, то как?

Заранее спасибо!

Muratov Radik Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: Muratov Radik (статус: Посетитель)
Вопрос отправлен: 31 марта 2010, 16:13
Состояние вопроса: открыт, ответов: 0.


Мини-форум вопроса

Всего сообщений: 23; последнее сообщение — 2 апреля 2010, 15:43; участников в обсуждении: 4.

Страницы: [1] [2] [Следующая »]

Вадим К

Вадим К (статус: Академик), 31 марта 2010, 16:24 [#1]:

пользуйтесь GetClassName. А там уже по имени видно.
Галочка "подтверждения прочтения" - вселенское зло.
min@y™

min@y™ (статус: Доктор наук), 31 марта 2010, 16:37 [#2]:

Чтобы перебрать дочерние оконные элементы, юзай функцию EnumChildWindows(). Чтобы определить класс дочернего элемента, пригодится функция GetClassName(), как выше написал Вадим К.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
Паровоз

Паровоз (статус: 10-ый класс), 31 марта 2010, 19:18 [#3]:

Странная постановка задачи. Обычно в конкретном приложении нужно найти конкретный элемент. А у Вас просто нужно найти все и затем сделать все, что можно сделать.
Muratov Radik

Muratov Radik (статус: Посетитель), 1 апреля 2010, 09:15 [#4]:

Подскажите где ошибка. Процедура находит не только элементы в нужном мне окне, но и меняет Caption у всех открытых приложений в системе.
function EnumChildWnd(h: HWND): BOOL; stdcall;
implementation
 
{$R *.dfm}
 
function EnumChildWnd(h: HWND): BOOL; stdcall;
begin
 SendMessage(h, WM_SETTEXT, 0,lparam(LPCTSTR('New caption')));
 Result := true;
end;
//
procedure TForm1.Button1Click(Sender: TObject);
var
 han: HWND;
begin
 
 han := FindWindow(0, 'My Test App');
 if han <> 0 then
  begin
 
   while true do
    begin
     EnumChildWindows(han, @EnumChildWnd, 0);
     Sleep(100);
    end;
  end;
end;
Паровоз

Паровоз (статус: 10-ый класс), 1 апреля 2010, 12:56 [#5]:

Вообще то Ваша программа должна виснуть потому что находится в бесконечном цикле. Нужно заменить
while true do
  begin
    EnumChildWindows(han, @EnumChildWnd, 0);
    Sleep(100);
  end;
просто на
EnumChildWindows(han, @EnumChildWnd, 0);
так как EnumChildWindows сама организует цикл по всем дочерним окнам
Muratov Radik

Muratov Radik (статус: Посетитель), 1 апреля 2010, 13:11 [#6]:

Спасибо. Помогло. А как называется сообщение, чтобы кнопка нажалась? И вообще где можно посмотреть все виндовые сообщения?
На сайте msdn нашел, но почему-то там не все :(
Вадим К

Вадим К (статус: Академик), 1 апреля 2010, 13:18 [#7]:

Не все?:) а Вы помните их всех, раз делаете такой вывод?:)

Вообще то можно открыть файл messages.pas - там точно весь список, которые делфи знает.
Галочка "подтверждения прочтения" - вселенское зло.
min@y™

min@y™ (статус: Доктор наук), 1 апреля 2010, 13:20 [#8]:

Цитата (Muratov Radik):

А как называется сообщение, чтобы кнопка нажалась?

BM_CLICK.
An application sends a BM_CLICK message to simulate the user clicking a button. This message causes the button to receive a WM_LBUTTONDOWN and a WM_LBUTTONUP message, and the button's parent window to receive a BN_CLICKED notification message.

Цитата (Muratov Radik):

На сайте msdn нашел, но почему-то там не все :(

Вероятно, хреново искал.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
Вадим К

Вадим К (статус: Академик), 1 апреля 2010, 13:38 [#9]:

Ну BM_CLICK на сайте мсдн и не найдешь:)
Галочка "подтверждения прочтения" - вселенское зло.
Muratov Radik

Muratov Radik (статус: Посетитель), 1 апреля 2010, 13:42 [#10]:

Я извиняюсь за глупые вопросы, но:
1) SendMessage(h, BM_CLICK, 0 , 0) не работает;
2) где узнать какие параметры(lparam, wparam) нужно передавать/принимать при посылке того или иного сообщения?
на сайте в описании SendMessage написано
wParam [in]
WPARAM

Specifies additional message-specific information.
lParam [in]
LPARAM

Specifies additional message-specific information.
и все
Вадим К

Вадим К (статус: Академик), 1 апреля 2010, 13:53 [#11]:

BM_CLICK будет работать только внутри приложения. Это "внутренне сообщение".

Какие передавать параметры? надо смотреть для каждого сообщения отдельно.
Галочка "подтверждения прочтения" - вселенское зло.
Muratov Radik

Muratov Radik (статус: Посетитель), 1 апреля 2010, 14:02 [#12]:

А как же тогда нажать кнопку в другом приложении?
Паровоз

Паровоз (статус: 10-ый класс), 1 апреля 2010, 14:05 [#13]:

"SendMessage(h, BM_CLICK, 0 , 0) не работает"

Совсем не обязательно, чтобы чужое приложение обрабатывало BM_CLICK. Оно, например, может реагировать только на пару сообщений WM_LBUTTONDOWN WM_LBUTTONUP
Muratov Radik

Muratov Radik (статус: Посетитель), 2 апреля 2010, 14:27 [#14]:

Появился еще один вопрос. Я нахожу нужную мне кнопку
procedure TForm1.Button3Click(Sender: TObject);
var
 wnd, cwnd: HWND;
begin
wnd := FindWindow(nil, 'My test app');//получаем хендл главного окна
cwnd := FindWindowEx(wnd, 0, 0, 'Button1');// получаем хендл кнопки 
SendMessage(cwnd, WM_LBUTTONDOWN, 0, 0);// далее жмем
SendMessage(cwnd, WM_LBUTTONUP, 0, 0);
end;
и все работает. Но если название кнопки больше 8 символов, то не работает. Не находит такую кнопку. В чем может быть дело?
Может сталкивались с таким?
Вадим К

Вадим К (статус: Академик), 2 апреля 2010, 14:31 [#15]:

возвращает нулевой хендл?
попробуйте сразу после вызова FindWindowEx вставить
ShowMessage('код ошибки = '+ IntToStr(GetLastError));
И потом сообщить этот код.
И третье - какая делфи?
Галочка "подтверждения прочтения" - вселенское зло.
Muratov Radik

Muratov Radik (статус: Посетитель), 2 апреля 2010, 14:37 [#16]:

Да, возвращает нулевой хендл.
Код ошибки = 0.
Дельфи 7
Вадим К

Вадим К (статус: Академик), 2 апреля 2010, 14:42 [#17]:

Попробуйте вместо 'Button1' писать PChar('Button1')
Галочка "подтверждения прочтения" - вселенское зло.
Muratov Radik

Muratov Radik (статус: Посетитель), 2 апреля 2010, 14:46 [#18]:

Все равно хендл = 0.
Вадим К

Вадим К (статус: Академик), 2 апреля 2010, 14:51 [#19]:

в 4 буквы поверил бы. (просто делфи строки до 4 букв сохранят хитрым способом)
Остался последний способ -
s:string;
/////
s := 'Button1';
cwnd := FindWindowEx(wnd, 0, 0, PChar(s));
Если ненайдет, то подозреваю, что такой кнопки точно нет.
А пробовали искать в других приложениях? А то некоторые умельцы умудряются вписать в название например латинскую o вместо кириллической о. На глаз не видно, а работать не будет.
Галочка "подтверждения прочтения" - вселенское зло.
Muratov Radik

Muratov Radik (статус: Посетитель), 2 апреля 2010, 14:55 [#20]:

Сейчас попробую через string. А приложение это мое. Я его сделал специально для отладки. Там все названия проверил.

Страницы: [1] [2] [Следующая »]

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 12:03
Выполнено за 0.03 сек.