51

Re: Автологин в QUIK (на Lua)

kalikazandr, согласен проверка по массиву интереснее смотрится.
У меня получилось так

function WorkTime() -- Возвращает флаг рабочего времени
  local GMT3=3*60*60   -- Часовой пояс биржи GMT+3 (Москва)
  local dt=os.date("!*t",os.time()+GMT3)
  -- Суббота и воскресенье - нерабочие дни
  if(dt.wday==1)or(dt.wday==7)then return false end
  -- Нерабочие дни смотрим в торговом календаре на московской бирже https://www.moex.com/s223
  local holyday={[20200101]=true,[20200102]=true,[20200107]=true,[20200224]=true,[20200309]=true,[20200511]=true,[20200624]=true,[20200701]=true,[20201104]=true}
  if holyday[dt.year*10000+dt.month*100+dt.day] then return false end
  -- Отсекаем время "до" начала поддержки соединения
  if(dt.hour*60+dt.min)<(START_HOUR*60+START_MIN)then return false end
  return true
end

52

Re: Автологин в QUIK (на Lua)

BlaZed пишет:

У меня получилось так

зачем вы переделываете то, что работает? возьмите функции мелкософта и тупо переделайте, вы же лучше знаете.
те люди, которые их делали, тупые до жути, не то что вы.

53

Re: Автологин в QUIK (на Lua)

Подскажите, кто-нибудь задавался вопросом шифрования скрипта автологина.
Все же в нем логин и пароль содержатся.
Я пробовал компилировать скрипт, но это не помогло, компиляция как оказалась содержимое скрипта не прячет.
Если посмотреть содержимое скомпилированного файла, то и логин и пароль сразу видно.

54

Re: Автологин в QUIK (на Lua)

BlaZed пишет:

Подскажите, кто-нибудь задавался вопросом шифрования скрипта автологина.
Все же в нем логин и пароль содержатся.

Если уж кто-то сумел утянуть ваш скрипт - то, наверняка, у него есть доступ и на машину с установленным QUIK. Так что шифруй или не шифруй - смысла нет.
Такой подход.

55 (2020-10-09 01:23:27 отредактировано toxa)

Re: Автологин в QUIK (на Lua)

Можно зашифровать файл при помощи rsa, потом взять какой-нибудь pageant от putty... При необходимости установить соединение расшифровываем файл через него, получаем в памяти пароль, логинимся, чистим память. Pageant висит в памяти и хранит в себе ключи. Ключи на диске не храним. В случае кражи всего квика со всеми файлами расшифровать и получить пароль будет затруднительно.

В случае разрыва соединения каждый раз расшифровываем через Pageant и подчищаем. Если квик упал, то Pageant - вещь надежная.

Можно, конечно, в теории, перехватить руткитом каким-нибудь, например, но это уж совсем сложно.

56 (2020-11-27 00:03:14 отредактировано eugene.bright)

Re: Автологин в QUIK (на Lua)

День добрый всем!

Что нужно вписать в скрипт автологина, чтобы по определенному признаку автологин переключался с основного сервера на резервный и обратно? Мой брокер периодически меняет серверы, но не сообщает заблаговременно. Хочется автоматизировать процесс переключения.

Справочник ip-адресов серверов имеется.

Заранее спасибо.

UPD (прошло 4 часа): к скрипту автологина дописал нужный фрагмент. Спасибо за то, что не балуете. )))

57

Re: Автологин в QUIK (на Lua)

Здравствуйте! А у всех работает автологин в Quik 8.9? Вроде скрипт работает, курсор замирает, но ввод не происходит.

58

Re: Автологин в QUIK (на Lua)

genom2000 пишет:

Здравствуйте! А у всех работает автологин в Quik 8.9? Вроде скрипт работает, курсор замирает, но ввод не происходит.

8.9.0.107 скрипт работает отлично
Если брали пример из стартового поста, то работать не будет, окно логина с тех времен немного изменилось. Дальше в теме есть рабочие варианты скрипта.
PS: курсор замирать не должен, если комп, конечно, не древний как мамонт.

59

Re: Автологин в QUIK (на Lua)

eugene.bright пишет:

UPD (прошло 4 часа): к скрипту автологина дописал нужный фрагмент. Спасибо за то, что не балуете. )))

Не стесняйтесь, поделитесь здесь вашим решением. Наверняка оно еще кому-то будет полезно.

60 (2020-12-07 12:42:30 отредактировано genom2000)

Re: Автологин в QUIK (на Lua)

BlaZed пишет:

8.9.0.107 скрипт работает отлично
Если брали пример из стартового поста, то работать не будет, окно логина с тех времен немного изменилось. Дальше в теме есть рабочие варианты скрипта.
PS: курсор замирать не должен, если комп, конечно, не древний как мамонт.

Добрый день! Странно, у меня тоже 8.9.0.107. Пробовал Ваш код с предыдущей страницы ветки, но результат тот же. w32.dll скопировал из папки для 5.3. Что я еще сделал не так?

UPD: Вопрос закрыт. local hWnd=w32.FindWindow("", "Идентификация пользователя") "Идентификация пользователя" поменял на "Вход в систему".

61 (2020-12-07 22:33:24 отредактировано BlaZed)

Re: Автологин в QUIK (на Lua)

swerg пишет:
eugene.bright пишет:

UPD (прошло 4 часа): к скрипту автологина дописал нужный фрагмент. Спасибо за то, что не балуете. )))

Не стесняйтесь, поделитесь здесь вашим решением. Наверняка оно еще кому-то будет полезно.

Ради интереса реализовал перебор серверов.

В начало скрипта

n=0

Перед отправкой клика в окне логина.

local serv_count=7 -- количество серверов в списке
n=n%serv_count
local CB_SETCURSEL = 0x014E
w32.PostMessage(hServe,CB_SETCURSEL,n,0)
n=n+1

Но чтобы количество элементов в списке серверов автоматом узнать SendMessage нужен.
Да и для выбора сервера вместо PostMessage тут лучше использовать SendMessage, а его не нашел в w32.dll
Поэтому дальше замарачиваться не стал.

PS: swerg, может добавите в библиотеку функцию SendMessage и константы CB_SETCURSEL и CB_GETCOUNT?

62 (2020-12-08 16:07:39 отредактировано swerg)

Re: Автологин в QUIK (на Lua)

BlaZed пишет:

Но чтобы количество элементов в списке серверов автоматом узнать SendMessage нужен.
Да и для выбора сервера вместо PostMessage тут лучше использовать SendMessage, а его не нашел в w32.dll

SendMessage() есть. А вот в список функций в писании не была добавлена, это да.

BlaZed пишет:

PS: swerg, может добавите в библиотеку функцию SendMessage и константы CB_SETCURSEL и CB_GETCOUNT?

Сделано.

63 (2020-12-08 23:18:09 отредактировано BlaZed)

Re: Автологин в QUIK (на Lua)

swerg пишет:

Сделано.

Огромное спасибо!

Модифицировал скрипт, добавил функционал перебора серверов

Функционал данной модификации:
с 9:50 по 0:00 МСК поддерживает соединение;
поддержка соединения работает только в рабочие дни Московской биржи;
вводит логин и пароль и соединяется с сервером;
с первой попытки пытается соединиться с сервером по умолчанию,
при неудаче начинает перебор с первого по последний по кругу.

-- Автологин терминала QUIK
-- (c) http://quik2dde.ru/
-- Версия: 3.3 (BlaZed Edition)
local w32 = require("w32")
QUIK_LOGIN="LOGIN"      -- Логин
QUIK_PASSW="PASSWORD"   -- Пароль
serv_n=-1
is_run = true
function main()
  while is_run do
    if(isConnected()==0)then
      if(WorkTime()==true)then
        QuikConnect() -- Нажать кнопку "Установить соединение с информационным сервером"
      end
      QuikLogin() -- Ввести Логин/Пароль и нажать кнопку "Вход"
    else
      serv_n=-1
    end
    sleep(1000)
  end
end
function OnStop()
  is_run=false
  return 100
end
function QuikConnect() -- Нажать кнопку "Установить соединение с информационным сервером"
  local hWnd=w32.FindWindow("InfoClass","")
  if hWnd~=0 then w32.PostMessage(hWnd,w32.WM_COMMAND,100,0) end
end
function QuikLogin() -- Ввести Логин/Пароль и нажать кнопку "Вход"
  local hWnd=w32.FindWindow("", "Идентификация пользователя")
  if hWnd==0 then hWnd=w32.FindWindow("", "User identification") end
  if hWnd~=0 then
    local hServe=w32.FindWindowEx(hWnd,0,"","")
    local hLogin=w32.FindWindowEx(hWnd,hServe,"","")
    local nPassw=w32.FindWindowEx(hWnd,hLogin,"","")
    if(serv_n>=0)then -- при первой попытке коннект к серверу из последнего соединения, при неудачном коннекте перебор
      local serv_count=w32.SendMessage(hServe,w32.CB_GETCOUNT,0,0)
      serv_n=serv_n%serv_count
      w32.SendMessage(hServe,w32.CB_SETCURSEL,serv_n,0)
    end
    serv_n=serv_n+1
    w32.SetWindowText(hLogin,QUIK_LOGIN)
    w32.SetWindowText(nPassw,QUIK_PASSW)
    w32.PostMessage(hWnd,w32.WM_COMMAND,1,0)
  end
end
function WorkTime() -- Возвращает флаг рабочего времени
  local GMT3=10800   -- Часовой пояс биржи GMT+3 Москва (3*60*60=10800 - количество секунд в 3 часах)
  dt=os.date("!*t",os.time()+GMT3)
-- Торговый календарь московской биржи
-- 2021 год www.moex.com/s3196
-- true - рабочий день, false - не рабочий день, nil - проверяем день недели
  local calendar={[20201231]=false,[20210101]=false,[20210107]=false,[20210220]=true,[20210223]=false,[20210308]=false,[20210503]=false,[20210510]=false,[20210614]=false,[20211104]=false,[20211231]=false}
  local today=calendar[dt.year*10000+dt.month*100+dt.day]
  if(today==false)or((today==nil)and((dt.wday==1)or(dt.wday==7)))then return false end
  if(dt.hour*60+dt.min < 590) then return false end -- Отсекаем время до 9:50 (9*60+50=590 - количество минут с 0:00 до 9:50)
  return true
end

Работает на 8.9.0.107
Не забудьте обновить библиотеку w32.dll из первого поста, она изменилась.

64

Re: Автологин в QUIK (на Lua)

BlaZed пишет:
swerg пишет:

Сделано.

Огромное спасибо!

Модифицировал скрипт, добавил функционал перебора серверов

Функционал данной модификации:
с 9:50 по 0:00 МСК поддерживает соединение;
поддержка соединения работает только в рабочие дни Московской биржи;
вводит логин и пароль и соединяется с сервером;
с первой попытки пытается соединиться с сервером по умолчанию,
при неудаче начинает перебор с первого по последний по кругу.

-- Автологин терминала QUIK
-- (c) http://quik2dde.ru/
-- Версия: 3.3 (BlaZed Edition)
local w32 = require("w32")
QUIK_LOGIN="LOGIN"      -- Логин
QUIK_PASSW="PASSWORD"   -- Пароль
serv_n=-1
is_run = true
function main()
  while is_run do
    if(isConnected()==0)then
      if(WorkTime()==true)then
        QuikConnect() -- Нажать кнопку "Установить соединение с информационным сервером"
      end
      QuikLogin() -- Ввести Логин/Пароль и нажать кнопку "Вход"
    else
      serv_n=-1
    end
    sleep(1000)
  end
end
function OnStop()
  is_run=false
  return 100
end
function QuikConnect() -- Нажать кнопку "Установить соединение с информационным сервером"
  local hWnd=w32.FindWindow("InfoClass","")
  if hWnd~=0 then w32.PostMessage(hWnd,w32.WM_COMMAND,100,0) end
end
function QuikLogin() -- Ввести Логин/Пароль и нажать кнопку "Вход"
  local hWnd=w32.FindWindow("", "Идентификация пользователя")
  if hWnd==0 then hWnd=w32.FindWindow("", "User identification") end
  if hWnd~=0 then
    local hServe=w32.FindWindowEx(hWnd,0,"","")
    local hLogin=w32.FindWindowEx(hWnd,hServe,"","")
    local nPassw=w32.FindWindowEx(hWnd,hLogin,"","")
    if(serv_n>=0)then -- при первой попытке коннект к серверу из последнего соединения, при неудачном коннекте перебор
      local serv_count=w32.SendMessage(hServe,w32.CB_GETCOUNT,0,0)
      serv_n=serv_n%serv_count
      w32.SendMessage(hServe,w32.CB_SETCURSEL,serv_n,0)
    end
    serv_n=serv_n+1
    w32.SetWindowText(hLogin,QUIK_LOGIN)
    w32.SetWindowText(nPassw,QUIK_PASSW)
    w32.PostMessage(hWnd,w32.WM_COMMAND,1,0)
  end
end
function WorkTime() -- Возвращает флаг рабочего времени
  local GMT3=10800   -- Часовой пояс биржи GMT+3 Москва (3*60*60=10800 - количество секунд в 3 часах)
  dt=os.date("!*t",os.time()+GMT3)
-- Торговый календарь московской биржи
-- 2021 год www.moex.com/s3196
-- true - рабочий день, false - не рабочий день, nil - проверяем день недели
  local calendar={[20201231]=false,[20210101]=false,[20210107]=false,[20210220]=true,[20210223]=false,[20210308]=false,[20210503]=false,[20210510]=false,[20210614]=false,[20211104]=false,[20211231]=false}
  local today=calendar[dt.year*10000+dt.month*100+dt.day]
  if(today==false)or((today==nil)and((dt.wday==1)or(dt.wday==7)))then return false end
  if(dt.hour*60+dt.min < 590) then return false end -- Отсекаем время до 9:50 (9*60+50=590 - количество минут с 0:00 до 9:50)
  return true
end

Работает на 8.9.0.107
Не забудьте обновить библиотеку w32.dll из первого поста, она изменилась.

В коде есть как минимум одна алгоритмическая ошибка ) Метод WorkTime дергается в цикле каждую секунду, а внутри постоянно определяются как минимум две переменные, которые по сути константы: GMT3 и calendar. Это не имеет смысла и их нужно вынести в глобальную секцию и определять 1 раз при запуске.

Второй момент: данный скрипт вызывает утечку памяти. Причем это вопрос, скорее, к квику. Но так или иначе, код dt=os.date("!*t",os.time()+GMT3) выжирает память. Это видно в окне "Доступные скрипты" по колонке "Память". Я себе оптимизировал этот момент пока с помощью local curHour = tonumber(os.date("%H", os.time())) и т.д. Кстати, GTM в этом случае не нужен, вроде как.

65

Re: Автологин в QUIK (на Lua)

alik1241 пишет:

оптимизировал этот момент пока с помощью local curHour = tonumber(os.date("%H", os.time())) и т.д. Кстати, GTM в этом случае не нужен, вроде как.

Про GTM
Тут наверное вопрос в том какое локальное время на компьютере, где запущен скрипт.
Если это сервер (где-нибудь на хостинге), локальное время на котором настроено под другой часовой пояс - то наверное надёжнее настроить часовой пояс в скрипте. Чисто для надежности и легкости переноса на другие сервера при надобности.

alik1241 пишет:

Но так или иначе, код dt=os.date("!*t",os.time()+GMT3) выжирает память. Это видно в окне "Доступные скрипты" по колонке "Память"

Н-да, неожиданный момент... Вроде нормальный сам по себе код.

66 (2021-01-07 12:40:26 отредактировано BlaZed)

Re: Автологин в QUIK (на Lua)

alik1241 пишет:

В коде есть как минимум одна алгоритмическая ошибка ) Метод WorkTime дергается в цикле каждую секунду, а внутри постоянно определяются как минимум две переменные, которые по сути константы: GMT3 и calendar. Это не имеет смысла и их нужно вынести в глобальную секцию и определять 1 раз при запуске.

Согласен, можно вынести в глобал.
Решил что нагрузка минимальная, удобство чтения кода важнее.

alik1241 пишет:

Второй момент: данный скрипт вызывает утечку памяти. Причем это вопрос, скорее, к квику. Но так или иначе, код dt=os.date("!*t",os.time()+GMT3) выжирает память. Это видно в окне "Доступные скрипты" по колонке "Память". Я себе оптимизировал этот момент пока с помощью local curHour = tonumber(os.date("%H", os.time())) и т.д.

Это особенность работы функции os.date в lua.
На форуме квика я поднимал этот вопрос https://forum.quik.ru/forum1/topic6066/ (Алексей в теме это я) получил ответ что это не утечка памяти os.date, а вот такая особенность самой функции. Там же посоветовали добавить collectgarbage() чтобы не дожидаться сборщика мусора.

alik1241 пишет:

Кстати, GTM в этом случае не нужен, вроде как.

GTM добавил для пересчета локального часового пояса в часовой пояс москвы.
Если локальное время на компе московское, тогда можно обойтись и без GTM.

67

Re: Автологин в QUIK (на Lua)

swerg пишет:
alik1241 пишет:

оптимизировал этот момент пока с помощью local curHour = tonumber(os.date("%H", os.time())) и т.д. Кстати, GTM в этом случае не нужен, вроде как.

Про GTM
Тут наверное вопрос в том какое локальное время на компьютере, где запущен скрипт.
Если это сервер (где-нибудь на хостинге), локальное время на котором настроено под другой часовой пояс - то наверное надёжнее настроить часовой пояс в скрипте. Чисто для надежности и легкости переноса на другие сервера при надобности.

GTM добавлен для универсальности. Чтобы вне зависимости от локального часового пояса, скрипт работал по московскому времени.

swerg пишет:
alik1241 пишет:

Но так или иначе, код dt=os.date("!*t",os.time()+GMT3) выжирает память. Это видно в окне "Доступные скрипты" по колонке "Память"

Н-да, неожиданный момент... Вроде нормальный сам по себе код.

Про os.date ответил в предыдущем посте.
Самого этот момент смущал, но это не мой косяк, а такая кривая реализация os.date в lua

68 (2021-01-07 16:57:55 отредактировано alik1241)

Re: Автологин в QUIK (на Lua)

BlaZed пишет:
alik1241 пишет:

В коде есть как минимум одна алгоритмическая ошибка ) Метод WorkTime дергается в цикле каждую секунду, а внутри постоянно определяются как минимум две переменные, которые по сути константы: GMT3 и calendar. Это не имеет смысла и их нужно вынести в глобальную секцию и определять 1 раз при запуске.

Согласен, можно вынести в глобал.
Решил что нагрузка минимальная, удобство чтения кода важнее.

alik1241 пишет:

Второй момент: данный скрипт вызывает утечку памяти. Причем это вопрос, скорее, к квику. Но так или иначе, код dt=os.date("!*t",os.time()+GMT3) выжирает память. Это видно в окне "Доступные скрипты" по колонке "Память". Я себе оптимизировал этот момент пока с помощью local curHour = tonumber(os.date("%H", os.time())) и т.д.

Это особенность работы функции os.date в lua.
На форуме квика я поднимал этот вопрос https://forum.quik.ru/forum1/topic6066/ (Алексей в теме это я) получил ответ что это не утечка памяти os.date, а вот такая особенность самой функции. Там же посоветовали добавить collectgarbage() чтобы не дожидаться сборщика мусора.

alik1241 пишет:

Кстати, GTM в этом случае не нужен, вроде как.

GTM добавил для пересчета локального часового пояса в часовой пояс москвы.
Если локальное время на компе московское, тогда можно обойтись и без GTM.

Да, я тоже спросил на форуме и мне почти так же ответили.
Тут вопрос другой назрел. Как найти окно логина, принадлежащее конкретному окну квика? В примерах я нашел поиск окна квика через GetQuikMainWindowHandle. Далее, пытаюсь найти окно входа в конкретном квике

local hWnd = w32.FindWindowEx(hQuikWnd, 0, "", "Идентификация пользователя")

Но, хрен там плавал, не находит! Вопрос: почему, кто знает? Вместо 0 подставлял hWnd, менял местами 0 и hQuikWnd

69 (2021-01-07 18:51:57 отредактировано swerg)

Re: Автологин в QUIK (на Lua)

Окно логина - окно верхнего уровня, не дочернее, поэтому FindWindowEx нам тут не помощник.
Надо сравнивать id процесса найденного окна и id процесса нашего экземпляра QUIK.

Вот готовая функция поиска окна логина именно нашего QUIK:

-- Возвращает handle окна логина QUIK или 0 при ошибке
-- Если запущено несколько терминалов - выбирается тот QUIK, из которого запущен наш скрипт
function GetQuikLoginWindowHandle()
    local hWnd = 0
    while true do
        local hTmp = w32.FindWindowEx(0, hWnd, "", "Идентификация пользователя")
        if hTmp == 0 then
            hTmp = w32.FindWindowEx(0, hWnd, "", "User identification")
        end
        hWnd = hTmp
        if hWnd == 0 then
            break  -- окно логина не смогли найти
        end
        local t,ProcId = w32.GetWindowThreadProcessId(hWnd)
        if ProcId == w32.GetCurrentProcessId() then
            break  -- найдено окно логина нашего QUIK
        end
    end

    return hWnd
end

Соответственно в скрипте выше вот этот кусок

function QuikLogin() -- Ввести Логин/Пароль и нажать кнопку "Вход"
  local hWnd=w32.FindWindow("", "Идентификация пользователя")
  if hWnd==0 then hWnd=w32.FindWindow("", "User identification") end
  if hWnd~=0 then
.....

заменяем на такой:

function QuikLogin() -- Ввести Логин/Пароль и нажать кнопку "Вход"
  local hWnd=GetQuikLoginWindowHandle()
  if hWnd~=0 then
.....

70 (2021-01-07 21:26:28 отредактировано BlaZed)

Re: Автологин в QUIK (на Lua)

swerg пишет:

Вот готовая функция поиска окна логина именно нашего QUIK:

-- Возвращает handle окна логина QUIK или 0 при ошибке
-- Если запущено несколько терминалов - выбирается тот QUIK, из которого запущен наш скрипт
function GetQuikLoginWindowHandle()
    local hWnd = 0
    while true do
        local hTmp = w32.FindWindowEx(0, hWnd, "", "Идентификация пользователя")
        if hTmp == 0 then
            hTmp = w32.FindWindowEx(0, hWnd, "", "User identification")
        end
        hWnd = hTmp
        if hWnd == 0 then
            break  -- окно логина не смогли найти
        end
        local t,ProcId = w32.GetWindowThreadProcessId(hWnd)
        if ProcId == w32.GetCurrentProcessId() then
            break  -- найдено окно логина нашего QUIK
        end
    end

    return hWnd
end

В определенных условиях данный код не будет работать.
Например, если запущено несколько экземпляров quik с разными языковыми настройками. Может возникнуть ситуация, когда одновременно имеются несколько открытых окон логина.
Если данный скрипт запущен в английской версии, и дескриптор окна логина английской версии меньше дескриптора окна логина русской версии, то скрипт не найдет окно логина, пока окно логина в русской версии не закроется.

Ситуация, конечно, маловероятная, но вполне возможная.

Предлагаю небольшой апдейт вашей функции

    local hWndRU=w32.FindWindowEx(0,hWnd,"","Идентификация пользователя")
    local hWndEN=w32.FindWindowEx(0,hWnd,"","User identification")
    if(hWndRU~=0 and hWndEN~=0) then hWnd=math.min(hWndRU,hWndEN) else hWnd=math.max(hWndRU,hWndEN) end -- Находим минимальный ненулевой хандл

71

Re: Автологин в QUIK (на Lua)

swerg пишет:

Окно логина - окно верхнего уровня, не дочернее, поэтому FindWindowEx нам тут не помощник.
Надо сравнивать id процесса найденного окна и id процесса нашего экземпляра QUIK.

Да, я так и понял уже )) Я сначала не мог поверить, что оно окно верхнего уровня, это как минимум странно. Спасибо за пример, я примерно так и сделал

72

Re: Автологин в QUIK (на Lua)

BlaZed пишет:

В определенных условиях данный код не будет работать.
Например, если запущено несколько экземпляров quik с разными языковыми настройками. Может возникнуть ситуация, когда одновременно имеются несколько открытых окон логина.
Если данный скрипт запущен в английской версии, и дескриптор окна логина английской версии меньше дескриптора окна логина русской версии, то скрипт не найдет окно логина, пока окно логина в русской версии не закроется.

Этих тонкостей не знал, у меня квиков может быть парочка, но оба русские точно. Спасибо за код, попробую внедрить.

73

Re: Автологин в QUIK (на Lua)

Еще одно замечание.

    if(serv_n>=0)then -- при первой попытке коннект к серверу из последнего соединения, при неудачном коннекте перебор
      local serv_count=w32.SendMessage(hServe,w32.CB_GETCOUNT,0,0)
      serv_n=serv_n%serv_count
      w32.SendMessage(hServe,w32.CB_SETCURSEL,serv_n,0)
    end
    serv_n=serv_n+1

Этот кусок работать не будет из-за строки local serv_count=w32.SendMessage(hServe,w32.CB_GETCOUNT,0,0)!
Метод SendMessage возвращает булеву, а не количество итемов в комбо-боксе. Пока решил проблему просто задав кол-во итемов константой и отключением этой строки.

74

Re: Автологин в QUIK (на Lua)

alik1241 пишет:

Еще одно замечание.

    if(serv_n>=0)then -- при первой попытке коннект к серверу из последнего соединения, при неудачном коннекте перебор
      local serv_count=w32.SendMessage(hServe,w32.CB_GETCOUNT,0,0)
      serv_n=serv_n%serv_count
      w32.SendMessage(hServe,w32.CB_SETCURSEL,serv_n,0)
    end
    serv_n=serv_n+1

Этот кусок работать не будет из-за строки local serv_count=w32.SendMessage(hServe,w32.CB_GETCOUNT,0,0)!
Метод SendMessage возвращает булеву, а не количество итемов в комбо-боксе. Пока решил проблему просто задав кол-во итемов константой и отключением этой строки.

swerg, данный вопрос я переадресовываю вам.

Функция w32.SendMessage(hServe,w32.CB_GETCOUNT,0,0) должна возвращать именно количество элементов в комбосписках, а на данный момент и правда почему-то возвращает false

Сейчас проверил.
В библиотеке w32 скомпилированной 16.12.2020 возвращает false
В библиотеке w32 скомпилированной 08.12.2020 возвращает число

75 (2021-01-10 10:27:13 отредактировано swerg)

Re: Автологин в QUIK (на Lua)

alik1241 пишет:

Метод SendMessage возвращает булеву, а не количество итемов в комбо-боксе.

Да, это я накосячил в реализации SendMessge
Исправлено, библиотека обновлена