На главную
ПРАВИЛА FAQ Помощь Участники Календарь Избранное DigiMania RSS
msm.ru
! Правила раздела Visual C++ / MFC / WTL (далее Раздела)
1) На Раздел распространяются все Правила Форума.
2) Перед тем, как создать новый топик, убедитесь, что Вы читали Правила создания тем в Разделе.
3) Вопросы, не связанные с программированием (настройки MS Visual Studio, книги, библиотеки и т.д.),
обсуждаются в разделе C/C++: Прочее
4) Вопросы разработки .NET (Windows Form, C++/CLI и т.п.) приложений на Visual C++/C# обсуждаются в разделе .NET.
5) Нарушение Правил может повлечь наказание со стороны модераторов.

Полезные ссылки:
user posted image FAQ Раздела user posted image Обновления для FAQ Раздела user posted image Поиск по Разделу user posted image MSDN Library Online
Модераторы: ElcnU
  
> Нажатие на кнопку в другом приложении., Нажимаю кнопку ОТМЕНА, срабатывает с первого раза, а кнопка ОК, только со второго. Почему?
Прилагаю два проекта в VC++ 2012 года. В них окно проекта SetWinText содержит нажимаемые кнопки, а в окне проекта NazatNaKnopku две кнопки для нажатия в окгне первого проекта. Код функций нажатия:
ExpandedWrap disabled
    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 Кбайт, скачиваний: 5)
Прикреплённый файлПрикреплённый файлSetWinText.rar (66,17 Кбайт, скачиваний: 5)
Я бы посылал WM_COMMAND с ID нужной кнопки.
Одни с годами умнеют, другие становятся старше.
Это проверочные проекты. Задача стоит нажать на кнопку в приложении, про которое ничего не известно. Есть только ЕХЕ файл и видимое на экране окно с элементами интерфейса, с которыми надо работать. Конкретно надо заполнить некоторые поля ввода информацией и нажать ОК, чтобы программа начала автоматически работать.
ID кнопок легко получаются GetDlgCtrlID(). Всякие BUTTON_UP и _DOWN приложение обычно не интересуют и отдаются на откуп стандартному обработчику, который в конечном итоге всё равно конвертит их в WM_COMMAND, и вот уже оно обрабатывается диалоговой функцией приложения непосредственно. Теоретически может быть так, что приложение лопает именно кнопки, но это очень вряд ли, т.к. в стандартном применении не даёт никакого профита, зато сложнее в реализации. (Но вероятность каких-нибудь нестандартных применений конечно остаётся.)

Добавлено
В общем, я попробовал
ExpandedWrap disabled
            int id = ::GetDlgCtrlID(okno2);
            ::SendMessage(okno1, WM_COMMAND, id, (LPARAM)okno2);
работает надёжно.
Одни с годами умнеют, другие становятся старше.
Большое спасибо за помощь. В приложении, кнопку которого мы нажимаем, есть CEdit. Надо в него записать текст. Пробовал функцию

ExpandedWrap disabled
    ::SetWindowText(okno4, _T("Текст для записи"));

Но что то ничего не записывается. А вот текст кнопки таким способом меняется! Но есть глюк, новый текст кнопки не появится, пока не наведешь на кнопку мышку. okno4 находится успешно, по крайней мере okno4 не равно 0.
Разобрался с работой элементов диалога. В тестовом диалоге могу нажимать на кнопки, менять названия кнопок и содержимое поля CEdit. Но с целевым диалогом ничего не получается. Может быть дело в том что это диалог создан интернет браузером? При попытке получить название кнопки, мне выдается какая то строка китайских иероглифов.
Вот картинка из отладчика. Может она что то покажет для вас.
Ищу в диалоге окно с пустым текстом. Но оказалось, что текст выводится в отладчике китайскими иероглифами.
В целевом окне иероглифов нет! Может причина в том, что целевое окно создается браузером? Где грабли? Картинку прилагаю.
Прикреплённая картинка
Прикреплённая картинка
Думаю, проблема в том, что (цитирую):
Цитата
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.
SendMessage(..., WM_GETTEXT, ...) решит проблему?
Одни с годами умнеют, другие становятся старше.
Такой вариант работает! Но текст, который мне возвращается, непонятно что означает. К тому же в окне Login 2 поля ввода
и 2 кнопки, итого 4! А находится только два элемента с текстом TBXToolWindow1 и TBXToolWindow2. Вот картинка из отладчика:
Прикреплённая картинка
Прикреплённая картинка
Погуглил TBXToolWindow, оказалось что это какая то библиотека 2007 года. Что с этим делать, ума не приложу. Может кто нибудь что то посоветует?
Разобрался с библиотекой. Оказалось, что в окне диалога елочка. Окно1 - главное окно. В нем 3 окна-панельки (видимо дельфийские). А уже в этих панелях элементы. Сумел записать в поля логина и пароля строки, осталось нажать на кнопку Ок. Но пока не получается. Перепробовал по вашему методу посылать WM_COMMAND с ID элементов всем элементам диалога, пока ничего не сработало. Может есть какой то другой способ послать окну команду ОК?
Сообщение отредактировано: a_n_y_a -
Цитата a_n_y_a @
...(видимо дельфийские)
Или джавные. Если так, то WinAPI и не поможет, т.к. там собственная оконная библиотека с собственным менеджером, и всё отслеживается и отрисовывается вручную. Чтобы вмешаться в этот процесс, нужно знать, как оно там устроено.

Оно? Тогда Питон. Но что-то я там не вижу окошек.
Сообщение отредактировано: Qraizer -
Одни с годами умнеют, другие становятся старше.
Проблема решилась следующим образом:
ExpandedWrap disabled
        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);

А вариант
ExpandedWrap disabled
        int Id=::GetDlgCtrlID(okno3);
        ::SendMessage(okno1, WM_COMMAND, (WPARAM)Id, (LPARAM)0);

не сработал, возможно потому, что в этом дельфийском приложении нет кнопок, а вместо
кнопок какие нибудь другие окошки.

Теперь следующая задача. Есть окошко, надо в нем нажать на кнопку, находящуюся внизу окна.
Это одно документное приложение, написанное в VC++.
Как в этом случае добраться до окошка, содержащего эти кнопки?
Прикреплённая картинка
Прикреплённая картинка
Я разобрался. Там действительно не дельфи, а ява скрипт. Шел внутрь, от окна к окну, и на очередном шаге всплыли те же TBXToolWindow1! Понятно, что дальше кнопки, на которые мне и надо нажимать. Всем спасибо. Тема закрыта.
1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
0 пользователей:


Рейтинг@Mail.ru
[ Script Execution time: 0,2736 ]   [ 28 queries used ]   [ Generated: 25.04.18, 18:29 GMT ]