В
Stock# коннектор для Альфа-Директ добавил возможность автоматической авторизации в терминале.
Весь код находится в свободном доступe на
CodePlex.
Пример использования данной функциональности есть в Alfa/Samples/AlfaTest — задать свой логин и пароль, поставить галку AutoLogin и кликнуть Connect.
С точки зрения пользователя, после вызова _trader.Connect() вызываем ((AlfaTrader)_trader).Login(textBoxLogin.Text, textBoxPassword.Text), которому передаем данные для авторизации.
Для интересующихся реализацией краткое описание:
- Все взаимодействие с окнами Альфа-Директ осущеаствляется посредством SystemWindow из библиотеки Managed Windows API.
- Обработка авторизации происходит в отдельном потоке, используем ThreadPool из System.Threading.ThreadPool.QueueUserWorkItem(obj => new AlfaTerminal().Login(login, password, this));
- AlfaTerminal — класс, в котором заложена вся логика авторизации, метод Login.
- Далее проверям подключен ли терминал «if(trader.IsConnected)». Если подключен, то просто выходим, если нет, то при данном запросе он запуститься автоматически, так как будет создана сущность ADLite.Interop.
- Ищем процесс альфа-директа — Process.GetProcessesByName(_processName). Он нам необходим для получения списка всех дочерних окон приложения.
- При запуске терминала у нас автоматически появляется окно авторизации. Поиск нужного окна осуществляется через SystemWindow.AllChildWindows по параметрам ClassName и Title.
- Для поиска окон реализованы различные вспомогательные функции — WaitForOpen, GetAlfaWindows, GetLoginWindows..
- Нажатие кнопки OK осуществляется через отправку сообщения о нажатии левой кнопки мыши по центру кнопки: var buttonOkCtrl = loginWindow.AllChildWindows.First(w => w.Title == «OK»); var coords = WinApi.MakeParam(buttonOkCtrl.Size.Width / 2, buttonOkCtrl.Size.Height / 2); buttonOkCtrl.SendMessage(WM.LBUTTONDOWN, 0x0001, coords); buttonOkCtrl.SendMessage(WM.LBUTTONUP, 0, coords);
- Далее дожидаемся пока подключится терминал:WaitFor(() => trader.IsConnected, «Альфа-Директ подключен», 180);
- Находим окно приветствия и закрываем его: var welcomeWnd = WaitForOpen(() => GetWelcomeWindows(process), «Окно успешной авторизации»); welcomeWnd.SendClose();