Тема: w32 - Вызов WinAPI функций из Lua
Если из скрипта робота понадобилось вызвать какие-либо функции WinAPI - проще всего взять готовую библиотеку-обертку.
Например, библиотеку w32 для Lua.
Библиотека есть в пакете LuaForWindows, но вариант на этом сайте содержит больше функций, кроме того содержит варианты для для QUIK 6-7 (Win32), QUIK 8 (Win64), QUIK 8.5 (Win64, Lua5.3), QUIK 8.11 (Win64, Lua5.4).
Загрузка (ссылки):
[url=https://quik2dde.ru/static-img/78/w32.dll.zip]архив с готовой библиотекой w32.dll[/url]
[url=https://github.com/swerg/qlua-w32]Исходники на GitHub[/url]
Для справки: [url=https://github.com/luaforge/w32wrappers]сайт проекта w32[/url]; на основании этих исходников была сделана библиотека, представленная на этом сайте
Установка:
Скачать архив с библиотекой по ссылке выше.
Скопировать файл w32.dll в каталог с QUIK (т.е. там, где info.exe).
В зависимости от используемой версии QUIK файл w32.dll взять из соответствующей папки архива:
\x32 - для QUIK версий 6.x и 7.x
\x64-Lua51 - для QUIK версий 8.0..8.4
\x64-Lua53 - для QUIK версий 8.5 и более новых
\x64-Lua54 - для QUIK версий 8.11 и более новых
Важно:
Для сборок Lua53 и Lua54 добавлена проверка версии Lua, указанной для запуска скрипта. Т.е. если вы взяли сборку библиотеки для Lua5.3, а запустили скрипт на Lua5.4, то увидите ошибку:
"multiple Lua VMs detected. Expected 5.3 instead of 5.4"
И наоборот, если взяли сборку библиотеки для Lua5.4, а запустили скрипт на Lua5.43, то увидите ошибку:
"multiple Lua VMs detected. Expected 5.4 instead of 5.3"
Как одновременно держать готовыми библиотеки и для Lua5.3 и для Lua5.4 - это надо придумывать. Можно разложить их в разные каталоги и настраивать в скрипте нужные пути поиска в зависимости о версии Lua, которую можно определить в скрипте из глобальной переменной _VERSION.
Использование:
В начало скрипта вставляем
w32 = require("w32")
По поводу сборки библиотеки на этом сайте.
Сначала изменения были минимальны: в исходном коде я ничего не менял, лишь указал на использование qlua.dll вместо lua5.1.dll, так удобнее в использовании. Также пересобрал библиотеку так, чтобы никакие доп. библиотеки не требовались для работы.
Позже библиотека была перекомпилирована для x64 платформы, т.к. QUIK с версии 8.х стал 64-битным.
С выходом QUIK 8.5 (где встроена Lua5.3) библиотеку модифицировал так, чтобы можно было собирать как вариант для Lua5.1, так и для Lua5.3.
Со временем в библиотеку были добавлены дополнительные функции, отсутствующие в ней изначально, которые оказались необходимы для задач автоматизации QUIK.
Справка (документация):
Порядок, типы и количество аргументов функций, включенных в эту библиотеку, совпадают с соответствующими оригинальными функциями WinAPI. Поэтому подробная справка здесь для большинства функций не приводится. Справку по аргументам функций можно получить в документации от Microsoft.
Список поддерживаемых функций:
Важно: если вы хотите использовать функции, отмеченные здесь как "добавлена" - то необходимо скачать сборку именно с этого сайта, т.к. такие функции есть только в сборке с этого сайта!
ShellOpen
FindWindow
FindWindowEx (добавлена)
SetFocus (добавлена)
GetWindowText (добавлена)
SetWindowText (добавлена)
GetWindowPos (добавлена)
RegisterHotKey
SetForegroundWindow
PostMessage
SendMessage (добавлена)
PostThreadMessage
GetMessage
PeekMessage
ReplyMessage
DispatchMessage
SetTopmost
GetLastError
CloseHandle
CreateEvent
OpenEvent
PulseEvent
ResetEvent
SetEvent
CreateMutex
OpenMutex
ReleaseMutex
CreateSemaphore
OpenSemaphore
ReleaseSemaphore
CreateProcess
GetTempFileName
GetTempPath
CreateFile
ReadFile
WriteFile
TerminateProcess
GetExitCodeProcess
WaitForSingleObject
WaitForMultipleObjects
GetCurrentThreadId
RegisterWindowMessage
RegQueryValueEx
RegSetValueEx
RegDeleteKey
RegDeleteValue
RegEnumKeyEx
RegEnumValue
SetCurrentDirectory
SHDeleteKey
Sleep
GetVersion
FindFirstFile
FindNextFile
FindClose
SHGetSpecialFolderLocation
GetFullPathName
IsUserAdmin
OpenProcess
IsRunning
GetWindowThreadProcessId
threadId, processId = w32.GetWindowThreadProcessId(handleWindow)
OpenSCManager
OpenService
CloseServiceHandle
QueryServiceStatus
QueryServiceConfig
ControlService
DeleteService
StartService
mciSendString (добавлена)
Beep (добавлена)
MessageBeep (добавлена)
CoInitialize (добавлена)
CoUninitialize (добавлена)
GetUserName (добавлена)
GetCurrentProcessId (добавлена)
CloseWindow (добавлена)
IsWindowVisible (добавлена)
TabCtrl_GetItemCount (добавлена)
TabCtrl_SetCurFocus (добавлена)
TabCtrl_SetCurSel (добавлена)
TabCtrl_GetItemText (добавлена)
text = w32.TabCtrl_GetItemText(TabCtrlHwnd {, idx})
Если idx не задан - возвращается текст для текущей активной вкладки.
При ошибке возвращает nil
TabCtrl_GetItemIndexByText (добавлена)
idx = w32.TabCtrl_GetItemIndexByText(text)
Возвращает индекс вкладки по названию.
Если вкладка с таким названием не найдена - возвращает -1.
TabCtrl_GetCurSel (добавлена)
TabCtrl_GetCurFocus (добавлена)