После введения утренней торговой сессии проблема автоматического запуска торгового ПО стала особенно актуальна.
Хорошее решение предложил
Евгений Логунов в своей статье
«Простой автологин за 5 минут». Мы предложим аналогичное решение для КВИК на С++.
Задача очень простая — в 7:00 пробудить ПК с помощью планировщика заданий Windows, запустить несколько терминалов QUIK, и в каждом из них запустить торговых роботов, чтобы полностью освободить владельца всего этого счастья от физических и психических нагрузок, плохо влияющих на питание и здоровый образ жизни.
Итак, первое, что нам необходимо будет сделать это Автологин. Штука достаточно простая, учитывая то, что после запуска терминала он автоматически выдает окно приветствия. Нам нужно только дождаться появления этого окна, получить первое вводное поле (логин), второе вводное поле (пароль), вбить туда нужные значения и нажать на первую дочернюю кнопку этого окна: «Вход».
Естественно, что на загрузку терминала и появление приветственного окна нам необходимо будет отвести некоторое время, поэтому начнем с него :
// Глобальные переменные
int pause=1; // Время ожидания между повторными проверками в секундах
int timeout=20; // Таймаут ожидания окна идентификации в секундах
int connectionlag=20; // Время регистрации пользователя и подключения КВИК
Далее нам необходимо будет указать путь к ярлыку (!) терминала, заголовок окна приветствия, наш логин, пароль, и вызвать функцию QUICKSTART.
// ЗАПУСК КВИКА 1
const char* dir="C:\\Users\\Главный юзер\\Desktop\\ВТБ64-8.5.lnk"; // Путь к ярлыку Квик
const char* logintitle="Идентификация пользователя"; // Заголовок окна логина
const char* login="Kot-Begemot"; // ЛогИн
const char* password="SmartLab"; // Пароль
bool result;
result=QUICKSTART(dir,logintitle,login,password); if (result==false) {return 0;}
(Обратите внимание, что путь к ярлыку указывается через двойные слеши)
После чего функция QUICKSTART запустит КВИК функцией
ShellExecute(0,0,dir,0,0,5);
Дождется появления окна с указанным заголовком при помощи
hmain=FindWindow(NULL,logintitle);
Найдет первое и второе поле ввода через :
hlog=FindWindowExA(hmain,0,«Edit», NULL);
hpass=FindWindowExA(hmain,hlog,«Edit», NULL);
Установит им значения функцией
SendMessageA(hlog, WM_SETTEXT, 0, (LPARAM) login);
Найдет первую кнопку (Вход)
hbut и щелкнет по ней с помощью :
SendMessageA(hmain, WM_COMMAND, MAKEWPARAM(1, BN_CLICKED), (LPARAM)hbut);
И пока ARQA не поменяет окно приветствия КВИК все будет прекрасно работать, а если и поменяет, то с помощью SPY++ и аналогов можно будет рассмотреть новые идентификаторы и названия элементов управления, несколько адаптировав код. (
Как это сделать?)
Со второй частью — запуск LUA скриптов — все обстоит намного сложнее. Оказывается внутренняя иерархия окон и менюшек КВИК очень сложна и для ее полноценного представления требуется целое хакерское ПО. Даже простой поиск окна «Доступные скрипты» та ещё задача, потому что он стоит пра-пра-правнучкой родительского окна, родители которой потеряны. Поэтому мы введем простое требование — окно «доступные скрипты» должно быть «закреплено» в одной из вкладок Квик и содержать в себе только те скрипты, которые предназначены для авоматического запуска. В этом случае нам останется только спустится вниз по иерархии окон, найдя нужное и нажать в автоматическом режиме две кнопки — «выделить всё» и «запустить». Эти кнопки в версии 8.5.2.11 имеют ID 1008 и ID 1004. И нам опять остается надеяться только на то, что в ближайших версиях ни сама сложнейшая иерархия, ни ID кнопок не поменяются.
Запускается эта часть автоматики через функцию LUASCRIPTSTART :
result=LUASCRIPTSTART(); if (result==false) {return 0;}
Которая на элементарном уровне аналогична предыдущей функции.
Остается только
скачать файлы проекта, указать логин, пароль и пути, скомпилировать его в exe-файл при помощи любого компилятора, удалить из проекта личные данные и пользоваться программой на здоровье.
Нах городить огород с запуском/остановом квика?
А зачем их выключать накануне?