Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[35.173.215.152] |
|
Сообщ.
#1
,
|
|
|
Прилагаю два проекта в VC++ 2012 года. В них окно проекта SetWinText содержит нажимаемые кнопки, а в окне проекта NazatNaKnopku две кнопки для нажатия в окгне первого проекта. Код функций нажатия:
void CNazatNaKnopkuDlg::OnBnClickedButton1() { // TODO: Add your control notification handler code here HWND okno1,okno2; okno1=::FindWindow(0,_T("SetWinText")); okno2= ::FindWindowEx(okno1, 0, NULL, _T("Отмена")); ::SendMessage(okno2, WM_LBUTTONDOWN, 0, 0); Sleep(10); ::SendMessage(okno2, WM_LBUTTONUP, 0, 0); } void CNazatNaKnopkuDlg::OnBnClickedButton2() { // TODO: Add your control notification handler code here HWND okno1,okno2; okno1=::FindWindow(0,_T("SetWinText")); okno2= ::FindWindowEx(okno1, 0, NULL, _T("ОК")); ::SendMessage(okno2, WM_LBUTTONDOWN, 0, 0); Sleep(10); ::SendMessage(okno2, WM_LBUTTONUP, 0, 0); } Прикреплённый файлNazatNaKnopku.rar (66,58 Кбайт, скачиваний: 40) Прикреплённый файлSetWinText.rar (66,17 Кбайт, скачиваний: 44) |
Сообщ.
#2
,
|
|
|
Я бы посылал WM_COMMAND с ID нужной кнопки.
|
Сообщ.
#3
,
|
|
|
Это проверочные проекты. Задача стоит нажать на кнопку в приложении, про которое ничего не известно. Есть только ЕХЕ файл и видимое на экране окно с элементами интерфейса, с которыми надо работать. Конкретно надо заполнить некоторые поля ввода информацией и нажать ОК, чтобы программа начала автоматически работать.
|
Сообщ.
#4
,
|
|
|
ID кнопок легко получаются GetDlgCtrlID(). Всякие BUTTON_UP и _DOWN приложение обычно не интересуют и отдаются на откуп стандартному обработчику, который в конечном итоге всё равно конвертит их в WM_COMMAND, и вот уже оно обрабатывается диалоговой функцией приложения непосредственно. Теоретически может быть так, что приложение лопает именно кнопки, но это очень вряд ли, т.к. в стандартном применении не даёт никакого профита, зато сложнее в реализации. (Но вероятность каких-нибудь нестандартных применений конечно остаётся.)
Добавлено В общем, я попробовал int id = ::GetDlgCtrlID(okno2); ::SendMessage(okno1, WM_COMMAND, id, (LPARAM)okno2); |
Сообщ.
#5
,
|
|
|
Большое спасибо за помощь. В приложении, кнопку которого мы нажимаем, есть CEdit. Надо в него записать текст. Пробовал функцию
::SetWindowText(okno4, _T("Текст для записи")); Но что то ничего не записывается. А вот текст кнопки таким способом меняется! Но есть глюк, новый текст кнопки не появится, пока не наведешь на кнопку мышку. okno4 находится успешно, по крайней мере okno4 не равно 0. |
Сообщ.
#6
,
|
|
|
Разобрался с работой элементов диалога. В тестовом диалоге могу нажимать на кнопки, менять названия кнопок и содержимое поля CEdit. Но с целевым диалогом ничего не получается. Может быть дело в том что это диалог создан интернет браузером? При попытке получить название кнопки, мне выдается какая то строка китайских иероглифов.
|
Сообщ.
#7
,
|
|
|
Вот картинка из отладчика. Может она что то покажет для вас.
Ищу в диалоге окно с пустым текстом. Но оказалось, что текст выводится в отладчике китайскими иероглифами. В целевом окне иероглифов нет! Может причина в том, что целевое окно создается браузером? Где грабли? Картинку прилагаю. Прикреплённая картинка
|
Сообщ.
#8
,
|
|
|
Думаю, проблема в том, что (цитирую):
Цитата SendMessage(..., WM_GETTEXT, ...) решит проблему? If the specified window is a control, the text of the control is copied. However, GetWindowText cannot retrieve the text of a control in another application. |
Сообщ.
#9
,
|
|
|
Сообщ.
#10
,
|
|
|
Погуглил TBXToolWindow, оказалось что это какая то библиотека 2007 года. Что с этим делать, ума не приложу. Может кто нибудь что то посоветует?
|
Сообщ.
#11
,
|
|
|
Разобрался с библиотекой. Оказалось, что в окне диалога елочка. Окно1 - главное окно. В нем 3 окна-панельки (видимо дельфийские). А уже в этих панелях элементы. Сумел записать в поля логина и пароля строки, осталось нажать на кнопку Ок. Но пока не получается. Перепробовал по вашему методу посылать WM_COMMAND с ID элементов всем элементам диалога, пока ничего не сработало. Может есть какой то другой способ послать окну команду ОК?
|
Сообщ.
#12
,
|
|
|
Цитата a_n_y_a @ Или джавные. Если так, то WinAPI и не поможет, т.к. там собственная оконная библиотека с собственным менеджером, и всё отслеживается и отрисовывается вручную. Чтобы вмешаться в этот процесс, нужно знать, как оно там устроено. ...(видимо дельфийские) Оно? Тогда Питон. Но что-то я там не вижу окошек. |
Сообщ.
#13
,
|
|
|
Проблема решилась следующим образом:
HWND okno1,okno2, okno3; okno1=::FindWindow(0,_T("Login")); okno2= ::FindWindowEx(okno1, 0, NULL, NULL); okno2= ::FindWindowEx(okno1, okno2, NULL, NULL); okno3= ::FindWindowEx(okno2, 0, NULL, NULL); okno3= ::FindWindowEx(okno2, okno3, NULL, NULL); okno3= ::FindWindowEx(okno2, okno3, NULL, NULL); ::SendMessage(okno3, WM_SETTEXT, 0, (LPARAM)_T("Здесь записываем пароль"));// Реальные пароль и логин я выложить не могу. okno3= ::FindWindowEx(okno2, okno3, NULL, NULL); ::SendMessage(okno3, WM_SETTEXT, 0, (LPARAM)_T("Здесь записываем логин")); okno2= ::FindWindowEx(okno1, okno2, NULL, NULL); okno3= ::FindWindowEx(okno2, 0, NULL, NULL); okno3= ::FindWindowEx(okno2, okno3, NULL, NULL); ::SendMessage(okno3, WM_LBUTTONDOWN, 0, 0); Sleep(10); ::SendMessage(okno3, WM_LBUTTONUP, 0, 0); А вариант int Id=::GetDlgCtrlID(okno3); ::SendMessage(okno1, WM_COMMAND, (WPARAM)Id, (LPARAM)0); не сработал, возможно потому, что в этом дельфийском приложении нет кнопок, а вместо кнопок какие нибудь другие окошки. Теперь следующая задача. Есть окошко, надо в нем нажать на кнопку, находящуюся внизу окна. Это одно документное приложение, написанное в VC++. Как в этом случае добраться до окошка, содержащего эти кнопки? Прикреплённая картинка
|
Сообщ.
#14
,
|
|
|
Я разобрался. Там действительно не дельфи, а ява скрипт. Шел внутрь, от окна к окну, и на очередном шаге всплыли те же TBXToolWindow1! Понятно, что дальше кнопки, на которые мне и надо нажимать. Всем спасибо. Тема закрыта.
|