Для того, чтобы постоянно вручную не вводить логин/пароль в терминале QUIK, используйте данный скрипт, написанный на языке Lua, или QLua (Lua, интерпретированный под QUIK).
Для QUIK 8 x64 используйте данное консольное приложение (СКАЧАТЬ), внутри архива 2 файла, само приложение AutoLogin.exe и текстовый файл Login.txt, в первой строке которого укажите Ваш логин, а во второй пароль. Текстовый файл должен находится рядом с EXE-шником. Можете закинуть их в папку автозапуска Windows, чтобы каждый раз не запускать. Если терминал Вы запускаете от имени администратора, то и AutoLogin.exe запускайте от имени администратора.
В последних версиях терминала изменилось окно ввода логина и пароля, чтобы этот скрипт мог с ним работать нужно заменить три строки 35 - 37 следующими четырьмя строками:
local hServer = w32.FindWindowEx(hLoginWnd, 0, "", "") local hLogin = w32.FindWindowEx(hLoginWnd, hServer, "", "") local nPassw = w32.FindWindowEx(hLoginWnd, hLogin, "", "") local nBtnOk = w32.FindWindowEx(hLoginWnd, nPassw, "", "") |
Код скрипта:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 | -- Автологин терминала QUIK -- (c) http://quik2dde.ru/ -- Версия: 1.0 local w32 = require("w32") -- логин и пароль для терминала QUIK_LOGIN = "MyLogin" QUIK_PASSW = "MyPassword" function FindLoginWindow() hLoginWnd = w32.FindWindow("", "Идентификация пользователя") if hLoginWnd == 0 then hLoginWnd = w32.FindWindow("", "User identification") end return hLoginWnd end timeout = 1000 -- таймаут между попытками поиска окна логина is_run = true function OnStop() timeout = 1 is_run = false end function main() while is_run do sleep(timeout) if isConnected() == 0 then local hLoginWnd = FindLoginWindow() if hLoginWnd ~= 0 then local hLogin = w32.FindWindowEx(hLoginWnd, 0, "", "") local nPassw = w32.FindWindowEx(hLoginWnd, hLogin, "", "") local nBtnOk = w32.FindWindowEx(hLoginWnd, nPassw, "", "") w32.SetWindowText(hLogin, QUIK_LOGIN) w32.SetWindowText(nPassw, QUIK_PASSW) w32.SetFocus(nBtnOk) w32.PostMessage(nBtnOk, w32.BM_CLICK, 0, 0) while not isConnected() do sleep(10); end; end end end end |
Скачать скрипт (не забудьте разархивировать перед помещением в папку).
Чтобы использовать данный скрипт, нужно в директорию, в которой установлен терминал QUIK, поместить библиотеку w32.dll, скачать которую можно по данной ссылке (не забудьте разархивировать перед помещением в папку).
Для Quik 8 x64 качайте вот эту w32.dll
Если Вы не знаете как запустить скрипт в торговом терминале QUIK, ознакомьтесь с данной статьей.
Если у Вас появились какие-то вопросы, задайте их в комментариях под статьей !!!
Скрипт взят здесь.
Приветствую всех. Данный пример скрипта у меня не срабатывал. Танцевал с бубном пару часов.
Нарыл на форуме: https://quik2dde.ru/viewtopic.php?id=80&p=2
Здесь немного исправлена только функция main() таким образом:
Теперь все ОК.
Добрый день.
Скрипт, работавший безукоризненно, на версии quik 8.4 перестал работать после обновления на 8.5. Ругается на w32.dll (error loading module 'w32' from file 'C:\Quik\w32.dll' Не найдена указанная процедура). Что можно предпринять?
Столкнулся с такой проблемой когда работают несколько квиков, то lua - скрипт автозапуска, использующий w32.dll одного квика , может пытаться "вставлять" имя пользователя и пароль в активное окно авторизации другого квика, получается ошибка. Нет ли возможности делать проверку как -то? Скорее всего нет, но все же.
есть решение, лучше, чем w32: https://quik2dde.ru/viewtopic.php?pid=2499
и, до кучи, может вот это будет интересно: https://quik2dde.ru/viewtopic.php?id=307 если у вас много квиков и вы хотите ими всеми рулить
Попробовал вашу библиотеку, в принципе видно, что работает авторизация. Но для приведения алгоритма действий к тому что был на w32.dll и lua скрипте, что приведен в данной статье, надо что - то править в коде. Не знаю сам разберусь ли. Но все равно спасибо.
в смысле в коде править? логин-пароль задать? или переименовать main() в login_quik() и вызывать ее в вечном цикле из main?
вот аналог, только проверка делается не по состоянию соединения, а по доступности пункта меню "логин", что даже несколько лучше в нашем случае:
[lua]
package.cpath = getScriptPath() .. "/?.dll"
qres = require "lua_quik_resources"
quik_resources_lib = "lang_res.dll" -- "lang_rus.dll" for QUIK8!
qres.HWND_DESKTOP = 0
qres.WM_COMMAND = 273
qres.INFOMENU_CONNECT = 100
qres.INFOMENU_DISCONNECT = 101
qres.IDOK = 1
qres.MF_ENABLED = 0
hQUIK = qres.get_quik_handle()
function manage_quik_connection(connect, quik_login, quik_password)
if connect then
local connect_menu_state = qres.get_menu_state(hQUIK, qres.INFOMENU_CONNECT)
if (connect_menu_state == qres.MF_ENABLED) then
local conn_dlg_title = tostring(qres.get_dlg_title(10107))
qres.post_message(hQUIK, qres.WM_COMMAND, qres.INFOMENU_CONNECT, 0)
sleep(100)
local hConnDlg = qres.get_child_handle(qres.HWND_DESKTOP, conn_dlg_title)
if (hConnDlg ~= 0) then
qres.set_dlg_item_text(hConnDlg, 10101, quik_login)
qres.set_dlg_item_text(hConnDlg, 10102, quik_password)
qres.post_message(hConnDlg, qres.WM_COMMAND, qres.IDOK, 0)
return "Login sent"
end
end
else
qres.post_message(hQUIK, qres.WM_COMMAND, qres.INFOMENU_DISCONNECT, 0)
return "Logout sent"
end
return nil
end
timeout = 1000
function OnStop()
exitflag = true
end
function main()
if (hQUIK ~= 0) then
while not exitflag do
local result = manage_quik_connection(true, "login", "password")
if result ~= nil then message(result, 1); end
sleep(timeout)
end
else
message("Unable to find QUIK main window handle", 1)
end
end
[/lua]
Спасибо за код. Видимо необходимо объединить два варианта. Последний вариант подключается при закрытом окне авторизации, т.е. когда мы запускаем Квик и выскакивает окно авторизации, входа не происходит, а сразу по закрытию окна авторизируется
что мешает снять галку в настройках "устанавливать соединение при старте quik"? как-то так называется вроде.
Если можно, для тех кто совсем не понимает, поподробнее. Этот скрипт в случае разрыва соединения будет снова устанавливать соединение?
Попробовал запустить вылезла ошибка:
C:\TECT\new 1.lua:2: module 'lua_quik_resources' not found:
no field package.preload['lua_quik_resources']
no file '.\lua_quik_resources.lua'
no file 'C:\QUIK_VTB24\lua\lua_quik_resources.lua'
no file 'C:\QUIK_VTB24\lua\lua_quik_resources\init.lua'
no file 'C:\QUIK_VTB24\lua_quik_resources.lua'
no file 'C:\QUIK_VTB24\lua_quik_resources\init.lua'
no file 'C:\QUIK_VTB24\Include\lua_quik_resources.lua'
no file 'C:\QUIK_VTB24\Include\lua_quik_resources.luac'
no file 'C:\QUIK_VTB24\LuaIndicators\lua_quik_resources.lua'
no file 'C:\QUIK_VTB24\LuaIndicators\lua_quik_resources.luac'
Где взять эти файлы?
тут: quik2dde.ru/viewtopic.php?pid=2499
можно. нужно проверять, что окно создано данным квиком. либа, на которую я дал ссылку, это делает. если мое решение вам не близко, то w32.GetWindowThreadProcessId() вам в руки.
спсибо , буду разбирать
По w32.GetWindowThreadProcessId() мы получаем Id необходимого окна, а с чем это сравнивать, как определить, что оно принадлежит нужному квику?
id процесса. сравнивать с GetCurrentProcessID(). но по-моему вы фигней страдаете. вообще, скрипт в статье должен виснуть, потому что логин не всегда приводит к коннекту квика, если сервер вас по какой-то причине отлупил, то
приведет к зависанию, так как isConnected() никогда не вернет true.
никогда не зайдет в этот цикл, т.к. всегда true
кстати, да, там же number возвращается.
главное - выявлен косячек) до вас никто не выявил)
ну просто из меня тот еще программист на lua.
вы отличный программист, не скромничайте)
ха-ха. посоветовал, а этой функции в w32 нет. 🙂 ну, это не страшно, добавьте ее сами по аналогии с какой-нибудь w32.GetCurrentThreadId(). исходники тут: quik2dde.ru/viewtopic.php?id=78
Здравствуйте, пытался запустить скрипт на Квике 8 версии с обновленной библиотекой w32, но ничего не вышло. Пишет ошибку: attempt to call field 'FindWindowEx'(nil value)
Здравствуйте, да, тоже заметил это, не подходит новая библиотека, написал в статье что скрипт не работает на 8 версии.
Обновленная 32 - взята с сайта источника? я так понял. У меня она то же не работает.
Да, брал с сайта.
Привет, добавил жирный шрифт в начало данной статьи 🙂
Оказывается появилась нормальная w32.dll, добавил в статью ссылку
Если появилась нормальная w32.dll для версии 8, то получается, как и прежде можно пользоваться скриптом qlua? просто заменить старую w32.dll на новую?
Да
Здравствуйте, добавил жирный шрифт в начало данной статьи
Здравствуйте, да,видел. Всё работает, доволен как слон) Библиотеку для отправки почты Вы случайно не пересобирали?)
Нет 🙂
Добрый день.
А можно создать консольное приложение:
Ярлыки этого ехешника и инфо закинуть в папку автозапуска. После запуска системы эта программка будет каждую секунду пытаться выполнить вход. Логин не вводится, стоит галка "Запомнить имя"
Доработать напильником.........
В коде, почему-то, отпали две священые библии: windows.h и strsafe.h Автор, что -то , не так с символом, который их окружает....
Спасибо, поправил
КОММЕНТАРИЙ:
А в чем же отличие????????
авторский скрипт, для заполнения полей управленния,верхнего окна, использует функции SetWindowText.
Однако, эта функция, работает только в пределах процесса.
ИЗ MSDN :
...Однако SetWindowText не может изменить текст органа управления в другом приложении.
Данная консолька, шлет сообщение полю управления с полученым дескриптором напрямую...
https://smart-lab.ru/blog/550216.php добрый человек поделился
Что_то переклинило во мне:
Сколько помню себя, вижу этот пост:
22.04.2015 12:17:42
Добрый день.
Работаете ли вы над созданием 64-битной версией QUIK? Или хотя бы есть ли в планах перевод версии на 64-bit?
Zoya Vdovina
QUIK clients support
22.04.2015 17:29:53
Добрый день.
На данный момент работ в этом направлении не ведётся.
🙂
Благодарю за совет, добавил приложение в начало статьи
Привет. Версия квик 8.0.2.3 - ошибка
error loading module 'w32' from file '.\w32.dll':
%1 не является приложением Win32.
Терминал QUIK 8 x64 Не думаю что на нем будет работать w32 библиотека
https://smart-lab.ru/blog/550216.php добрый человек поделился
Скрипт вместо Логина подставляет Пароль. А поле пароль оставляет пустым.
Логин ввожу сюда: QUIK_LOGIN
А пароль сюда: QUIK_PASSW
В чем может быть ошибка?
Даже не знаю, у меня все работает. внутрь кавычек вставляете?
QUIK_LOGIN = "MyLogin"
QUIK_PASSW = "MyPassword"
Да, внутри кавычек.
Подскажите, вот в этих строчках:
Почему напротив hLogin второй аргумент 0, а напротив nPassw → hLogin, nBtnOk → nPassw.
Здесь нет ошибки?
А Вы 2 большие красные строки читали в начале статьи? 🙂
Вот засада))
Читал их. Но потом скопировал код скрипта в Notepad++ и начал его изучать. А про эти строки забыл!
Спасибо. Все заработало!
Бывает 🙂 Всегда пожалуйста!
Привет, когда мы выходим из квика в штатном режиме или жмем кнопку "Сохранить настройки в файл...", то все супер сохраняется, а вот если у нас свет отключили или комп завис в общем аварийный выход из квика, то конфигурация не сохраняется. Вопрос можно ли с помощью этой библиотеки что то сделать, а именно автосохранение например каждые 5 минут - т.е. скрипт работает и делает сохранение конфигурации на автомате?
Привет, теоретически можно, но это не на 5 минут задача, нужно искать как в системе квика окна, кнопки называются, чтобы выполнить эмуляцию нужных действий пользователя.
я понимаю что ты сказал - просто я же не знаю как эти блин "кнопки" "эмулятивные" ну ты меня понял - суть то в этом - а запрос есть такой - ЛЮДЯМ надо - да я сам иной раз парюсь восстанавливать что да как - посмотри пожалуйста и тема то нужная и просто всем отдать раздать и тебя я разрекламирую еще сильнее ну а я в сторонке постою (во я борзота)
Не, мне вообще сейчас некогда этим заниматься, у меня строительный сезон начался
меня ткни носом где это покапать
WinAPI
Я недавно заказ делал по тому, чтобы выбросить все из таблицы "Карман транзакций", несколько вечеров мучился.
ну ты крутой
🙂
А не подскажите, как из QLua окошко кармана транзакций развернуть. Я так понимаю нужно использовать w32?
Да, w32, могу Вам решение готовое продать недорого 🙂
Спасибо, не надо. Я тоже немного помучился и сделал.
hWnd = FindWindow("InfoClass", NULL); // основное окно квика
дальше ищем нужное дочернее функцией FindWindowEx() и развертываем
ShowWindow(hWndChild, SW_SHOWNORMAL);
У меня там еще "Достать все из кармана" нажималось, долго мучился 🙂
Здравствуйте. Почему-то не может найти модуль w32: module 'w32' not found
Не подскажете, в чем может быть проблема? Заранее спасибо
Здравствуйте! А Вы вот эти строки видели в статье?:
"Чтобы использовать данный скрипт, нужно в директорию, в которой установлен терминал QUIK, поместить библиотеку w32.dll, скачать которую можно по данной ссылке (не забудьте разархивировать перед помещением в папку)."
Проглядел... Спасибо большое! Еще такой вопрос: очень долго не мог запустить код, в котором используются сервисные функции (getscriptPath, message и тд). Все в итоге запустилось только через добавление скрипта в QUIK. Через программу lExecutor и через командную строку запускать не удавалось, писал: attempt to call a global 'getScriptPath' (a nil value). Не подскажете, как можно запускать данные скрипты не через QUIK? Спасибо.
Всегда пожалуйста.Язык QLua специально для QUIK разрабатывался, это надстройка над Lua, без квика скрипты написанные на QLua нет никакого смысла запускать, если Вам нужны обычные скрипты Lua, то установите LuaForWindows и пишите их на чистом Lua.