|
Вопрос # 3 956/ вопрос открыт / |
|
Здравствуйте!
Пмомгите решить проблему.
Я ищу окно
FindWindow(nil, 'Caption');
Нахожу. И вот как мне теперь перебрать элементы на этом окне?
Т.е. определить кто есть Edit, кто BUtton и соответственно, либо вписать текст, либо нажать кнопку.
И вообще, возможно ли это. Если да, то как?
Заранее спасибо!
 |
Вопрос задал: Muratov Radik (статус: Посетитель)
Вопрос отправлен: 31 марта 2010, 16:13
Состояние вопроса: открыт, ответов: 0.
|
Мини-форум вопроса
Всего сообщений: 23; последнее сообщение — 2 апреля 2010, 15:43; участников в обсуждении: 4.
Страницы: [1] [2] [Следующая »]
|
Вадим К (статус: Академик), 31 марта 2010, 16:24 [#1]:
пользуйтесь GetClassName. А там уже по имени видно.
Галочка "подтверждения прочтения" - вселенское зло.
|
|
min@y™ (статус: Доктор наук), 31 марта 2010, 16:37 [#2]:
Чтобы перебрать дочерние оконные элементы, юзай функцию EnumChildWindows(). Чтобы определить класс дочернего элемента, пригодится функция GetClassName(), как выше написал Вадим К.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
Паровоз (статус: 10-ый класс), 31 марта 2010, 19:18 [#3]:
Странная постановка задачи. Обычно в конкретном приложении нужно найти конкретный элемент. А у Вас просто нужно найти все и затем сделать все, что можно сделать.
|
|
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 (статус: Посетитель), 1 апреля 2010, 13:11 [#6]:
Спасибо. Помогло. А как называется сообщение, чтобы кнопка нажалась? И вообще где можно посмотреть все виндовые сообщения?
На сайте msdn нашел, но почему-то там не все
|
|
Вадим К (статус: Академик), 1 апреля 2010, 13:18 [#7]:
Не все? а Вы помните их всех, раз делаете такой вывод?
Вообще то можно открыть файл messages.pas - там точно весь список, которые делфи знает.
Галочка "подтверждения прочтения" - вселенское зло.
|
|
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 (статус: Посетитель), 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 (статус: Посетитель), 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 (статус: Посетитель), 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 (статус: Посетитель), 2 апреля 2010, 14:37 [#16]:
Да, возвращает нулевой хендл.
Код ошибки = 0.
Дельфи 7
|
|
Вадим К (статус: Академик), 2 апреля 2010, 14:42 [#17]:
Попробуйте вместо 'Button1' писать PChar('Button1')
Галочка "подтверждения прочтения" - вселенское зло.
|
|
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 (статус: Посетитель), 2 апреля 2010, 14:55 [#20]:
Сейчас попробую через string. А приложение это мое. Я его сделал специально для отладки. Там все названия проверил.
|
Страницы: [1] [2] [Следующая »]
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|