Автоматизация с перехватом нажатия кнопок и мыши. - страница 7

 
HIDDEN >>:

Нашел интересное окно. Отловить в нем практически ничего не возможно. Окно называется "Сохранить как". Подскажите как нажать кнопку "Сохранить"

Если выбирать конкретно кнопку сохранить, то имеем код кнопки 00000001

Но при обращении к ней по этому коду ничего не происходит. Что-же это за окно такое безымянное какое-то.

Это всплывающее диалоговое окно. Его системный дескриптор можно получить с помощью WinAPI функции GetLastActivePopup(int hWnd).

Вот пример применения этой функции:

#include <WinUser32.mqh>

#import "user32.dll"
   int GetAncestor(int hWnd, int gaFlags);
   int GetDlgItem(int hDlg, int nIDDlgItem);
   int GetLastActivePopup(int hWnd);
#import

void start()
{
   int hMetaTrader, hDlg, hButtonSave, hChart = WindowHandle(Symbol(),Period());

   hMetaTrader = GetAncestor(hChart,2);          //дескриптор основного окна терминала
   PostMessageA(hMetaTrader,WM_COMMAND,57604,0); //вызываем окно сохранения
   Sleep(100);
   hDlg = GetLastActivePopup(hMetaTrader);       //получаем дескриптор всплывающего окна
   hButtonSave = GetDlgItem(hDlg,1);             //определяем дескриптор кнопки "Сохранить"
   PostMessageA(hDlg,WM_COMMAND,1,hButtonSave);  //нажимаем на кнопку
}
 

А на чекбоксах галачки програмно можно ставить если их нет.

т.е. Проверить если галочка, если нету то поставить если это необходимо. с помощью каких Win API функций это делается?

 

Нашел функцию в WinAPI:


Функция CheckDlgButton

Описание:
function CheckDlgButton(Dlg: HWnd; IDButton: Integer; Check: Word);

Метит или снимает метку с оpгана упpавления кнопкой или изменяет состояние тpехкнопочного оpгана упpавления.

Паpаметpы:
Dlg: Блок диалога, котоpый содеpжит кнопку.
IDButton: Модифициpуемый оpган упpавления кнопкой.

Сheck: удалена(0), отмечена(1), затенена(2).


Перед её выполнением какой функцией проверить состояние кнопки. В моём случае в чекбоксе.

 
Ilnur >>:



в продолжении темы API

при сохранении - если это происходит повторно возникнет вопрос!

сохранить как

( файл существует заменить )


отбиваем автоматом ДА


#include <WinUser32.mqh>

#import "user32.dll"
   int GetAncestor(int hWnd, int gaFlags);
   int GetDlgItem(int hDlg, int nIDDlgItem);
   int GetLastActivePopup(int hWnd);
#import

void start()
{
   int hMetaTrader, hDlg, hButtonSave, hChart = WindowHandle(Symbol(),Period());

   hMetaTrader = GetAncestor(hChart,2);          //дескриптор основного окна терминала
   PostMessageA(hMetaTrader,WM_COMMAND,57604,0); //вызываем окно сохранения
   Sleep(100);
   hDlg = GetLastActivePopup(hMetaTrader);       //получаем дескриптор всплывающего окна
   hButtonSave = GetDlgItem(hDlg,1);             //определяем дескриптор кнопки "Сохранить"

   PostMessageA(hDlg,WM_COMMAND,1,hButtonSave);  //нажимаем на кнопку ,
   Sleep(100);

// и тут может возникнуть еще один диалог ФАЙЛ СУЩЕСТВУЕТ  - сохранять ДА НЕТ
 
   int hDlg1 = GetLastActivePopup(hMetaTrader);      //  получаем дескриптор всплывающего окна СОХРАНЯТЬ ИЛИ НЕТ
   int hButtonYES = GetDlgItem(hDlg1,6);             //  определяем дескриптор кнопки  ДА  ID кнопки ДА он равен = 6
    PostMessageA(hDlg1,WM_COMMAND,6,hButtonYES);  // мы подтверждаем ДА


}
 
HIDDEN >>:

Нашел функцию в WinAPI:


Функция CheckDlgButton

Описание:
function CheckDlgButton(Dlg: HWnd; IDButton: Integer; Check: Word);

Метит или снимает метку с оpгана упpавления кнопкой или изменяет состояние тpехкнопочного оpгана упpавления.

Паpаметpы:
Dlg: Блок диалога, котоpый содеpжит кнопку.
IDButton: Модифициpуемый оpган упpавления кнопкой.

Сheck: удалена(0), отмечена(1), затенена(2).


Перед её выполнением какой функцией проверить состояние кнопки. В моём случае в чекбоксе.


Для определения текущего состояния переключателя вы можете воспользоваться функцией IsDlgButtonChecked:

UINT WINAPI IsDlgButtonChecked(HWND hdlg, int idButton);

Эта функция возвращает состояние переключателя с идентификатором idButton, расположенного в диалоговой панели hdlg. Если переключатель находится в выключенном состоянии, возвращается нулевое значение. Для включенного переключателя возвращается значение 1. Значение 2 соответствует неактивному переключателю, изображенному серым цветом. В случае ошибки возвращается отрицательное значение -1.

---


Пример работы IsDlgButtonChecked можно глянуть тут

http://frolov-lib.ru/books/bsp/v12/ch3_2.htm

 

Решил вернуться к теме изучения WinAPI.

Пытаюсь с помощью программы Microsoft Spy++ v.9.00.21022 найти идентификатор чекбокса "Оптимизация", дабы проверить програмно стоит ли галка или нет.

Делаю следующее по пунктам.

1. Запустил терминал.

2. Открыл окно тестера.


3. В программе Spy++ вызвал поиск окна и прицелом навел на элемент "Оптимизация"


нажал кнопку ОК.

4. Бегаю по вкладкам следующего окна


И не могу понять где же мой искомый код этой кнопки.


Ilnur, YuraZ и другие научите определять этот код дескриптора нужного мне элемента.



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

 

Здесь я приводил пример кода, как определить идентификатор кнопки "Старт".

Там же на рисунке показано, как находить идентификатор элемента управления.

Все элементы управления, расположенные в окне тестера стратегий, определяются аналогичным образом.

Например, судя по выложенной выше, картинке, идентификатор чекбокса "Оптимизация" (вкладка "Общие") - 0х405.

 
С кодами я разобрался. Единственное никак не могу отловить коды 2-х кнопок это даты для тестирования и оптимизации от "Дата" и до "Дата". Программа выводит 00000001. Ilnur подскажи коды этих кнопок.
 
HIDDEN >>:
С кодами я разобрался. Единственное никак не могу отловить коды 2-х кнопок это даты для тестирования и оптимизации от "Дата" и до "Дата". Программа выводит 00000001. Ilnur подскажи коды этих кнопок.

Да, действительно, идентификаторы этих элементов совпадают. Поэтому воспользоваться функцией GetDlgItem() в данном случае не получиться.

Остается вариант их идентификации с помощью FindWindowExA(). Однако, основной вопрос в том, есть ли необходимость в их определении.

Возможность управлять этими элементами, т.е. задавать период оптимизации или тестирования, средствами WinAPI на MQL отсутствует.

Хотя может я и ошибаюсь.

 
Ilnur >>:

Да, действительно, идентификаторы этих элементов совпадают. Поэтому воспользоваться функцией GetDlgItem() в данном случае не получиться.

Остается вариант их идентификации с помощью FindWindowExA(). Однако, основной вопрос в том, есть ли необходимость в их определении.

Возможность управлять этими элементами, т.е. задавать период оптимизации или тестирования, средствами WinAPI на MQL отсутствует.

Хотя может я и ошибаюсь.



найти элемент к примеру с ID - 0x0577( копка изменить экперта)

и прощелкать по цепочке NextWindow 3 раза как раз попадаем в поле дата От: далее еще два раза перебираем NextWindow и мы в поле дата До:

в обоих случаях просто заполнить поля даты

SetWindowTextA( hwndEditDATEbeg, sDateBeg);

SendMessageA(hwndEditDATEbeg, EN_UPDATE, _ID_EDIT_HEX_DATEbeg, 0);
SendMessageA(hwndEditDATEbeg, EN_CHANGE, _ID_EDIT_HEX_DATEbeg, 0);

..

в MSQL5 очень хотелось бы получить штатный инструмент общения с тестером...

Причина обращения: