Re: w32 - Вызов WinAPI функций из Lua
Добрый день!
Подскажите, пожалуйста, есть возможность сделать окно таблицы робота поверх всех окон?
Пытался посылать Alt_T Quik-у, но ничего не происходит.
Плиз, хелп.
Вы не вошли. Пожалуйста, войдите или зарегистрируйтесь.
QUIK -> DDE → Lua: готовые внешние библиотеки → w32 - Вызов WinAPI функций из Lua
Добрый день!
Подскажите, пожалуйста, есть возможность сделать окно таблицы робота поверх всех окон?
Пытался посылать Alt_T Quik-у, но ничего не происходит.
Плиз, хелп.
Michael1976, речь про таблицу, созданную из скрипта Lua, я верно понял ваш вопрос?
Да. Спасибо!
Подобрал )
-- скрипт при запуске переключает режим для окна "поверх всех" (вкл/выкл)
local w32 = require ("w32")
local WM_SYSCOMMAND = 0x0112
hWndQUIK = w32.FindWindowEx(0, 0, "InfoClass", "")
hMdi = w32.FindWindowEx(hWndQUIK, 0, "MDIClient", "")
hWndLua = w32.FindWindowEx(hMdi, 0, "", "Заголовок окна, созданного скриптом")
w32.PostMessage(hWndLua, WM_SYSCOMMAND, 0x0EFFF, 0)
Вместо строки "Заголовок окна, созданного скриптом" вписать верный заголовок окна, которое создаёт ваш скрипт, чтобы оно было найдено.
Убедиться, что окно найдено - проверить, что hWndLua не равно 0. Если равно 0 - смотреть, где ошибка, почему окно не определяется. Проверить предыдущие hWndQUIK и hMdi, проверить корректность указанного заголовка.
У меня точно работает этот скрипт.
Огромное Вам спасибо!!!
Работает.
У меня было 2 ошибки:
1. Не знал про контейнер MDIClient
Пытался искать напрямую в окне Quik-а. Естественно, не находил.
2. Вместо local WM_SYSCOMMAND = 0x0112 использовал
local WM_COMMAND = 0x0111
-- нажимаем кнопку
-- 84 - код Alt_T
w32.PostMessage(hWnd, WM_COMMAND, 84, 0)
Подскажите, пожалуйста, а 0x0EFFF - это что за команда?
w32.PostMessage(hWndLua, WM_SYSCOMMAND, 0x0EFFF, 0)
Как до нее можно додуматься/где почитать?
Смотреть какие окна и в какой иерархии созданы процессами и какие сообщения к ним прилетают помогает утилита Spy++ от Microsoft. Она идёт в составе любой Visual Studio, но и отдельно наверняка её не сложно сыскать.
Я просто посмотрел какие сообщению идут окну при нажатии Alt+T. Не с первого подхода - но нашел подходящее.
Расшифровать 0x0EFFF не берусь, было просто подсмотрено через Spy.
Еще раз большое Вам спасибо, что так доходчиво все объяснили!
можно прямую ссылку на аналог w32.dll для 8 Квика скинуть. что-то туплю...
Огромное Вам спасибо!!!
Подскажите, пожалуйста, а 0x0EFFF - это что за команда?
w32.PostMessage(hWndLua, WM_SYSCOMMAND, 0x0EFFF, 0)
Как до нее можно додуматься/где почитать?
про wm_syscommand - в msdn, про 0x0efff - в ресурсах квика (файл lang_res.dll). конкретно эта константа вот:
MENUITEM "&Поверх всех окон", 61439
61439 это и есть искомая константа. просто эмулируется выбор пункта системного меню.
MENUITEM "&Поверх всех окон", 61439
61439 это и есть искомая константа. просто эмулируется выбор пункта системного меню.
Спасибо, это в самом деле хорошая находка!
ну не то чтобы это находка, это же очевидные вещи. вообще, вы спрашивайте, я про квик почти все знаю.
Самую главную функцию забыли в w32: GetCurrentProcessId().
А для 8-го квика есть w32?
А для 8-го квика есть w32?
да. в первом сообщении этой темы.
Дядя_Фёдор пишет:А для 8-го квика есть w32?
да. в первом сообщении этой темы.
Спасибо. Нашел, ура.
Скажите, как надо поправить первое сообщение, чтобы из него сразу всё было понятно? Я сейчас серьёзно спрашиваю. наверняка оно написано не очень понятно.
имхо, что-то вроде "архив с готовой библиотекой w32.dll для QUIK7 и QUIK8". и, чтобы два раза не вставать, добавьте GetCurrentProcessId() для того, чтобы можно было сопоставить, например, найденное окно логина конкретному процессу квика, а то GetWindowThreadProcessID есть, но его не с чем сравнить.
Подобрал )
-- скрипт при запуске переключает режим для окна "поверх всех" (вкл/выкл) local w32 = require ("w32") local WM_SYSCOMMAND = 0x0112 hWndQUIK = w32.FindWindowEx(0, 0, "InfoClass", "") hMdi = w32.FindWindowEx(hWndQUIK, 0, "MDIClient", "") hWndLua = w32.FindWindowEx(hMdi, 0, "", "Заголовок окна, созданного скриптом") w32.PostMessage(hWndLua, WM_SYSCOMMAND, 0x0EFFF, 0)
Вместо строки "Заголовок окна, созданного скриптом" вписать верный заголовок окна, которое создаёт ваш скрипт, чтобы оно было найдено.
Убедиться, что окно найдено - проверить, что hWndLua не равно 0. Если равно 0 - смотреть, где ошибка, почему окно не определяется. Проверить предыдущие hWndQUIK и hMdi, проверить корректность указанного заголовка.У меня точно работает этот скрипт.
А на 8 квике не фурычит.
библиотечные функции должны выглядеть так, чтобы оно работало:
static int b4s_FindWindowEx(lua_State *L)
{
const char *cname = luaL_checkstring(L,3);
const char *wname = luaL_checkstring(L,4);
lua_pushlightuserdata(L,FindWindowEx((HWND)lua_touserdata(L,1),
(HWND)lua_touserdata(L,2),
cname[0] ? cname : NULL,
wname[0] ? wname : NULL));
return(1);
}
static int b4s_PostMessage(lua_State *L)
{
HWND hwnd = (HWND)lua_touserdata(L,1);
UINT msg = (UINT)luaL_checknumber(L,2);
WPARAM wparam = (WPARAM)luaL_checknumber(L,3);
LPARAM lparam = (LPARAM)luaL_checknumber(L,4);
lua_pushnumber(L, PostMessageA(hwnd, msg, wparam, lparam));
return(1);
}
lua_pushlightuserdata(L,FindWindowEx());
для того чтобы хендл представить в виде указателя, чтобы типа не потерялся старший dword? должно и без этого работать: [url]https://docs.microsoft.com/ru-ru/windows/win32/winprog64/interprocess-communication?redirectedfrom=MSDN[/url]
Без этого не работает. Иначе бы я не полез сюда.
Без этого не работает. Иначе бы я не полез сюда.
запускаете под wine в линуксе?
ps: тогда уж и все остальные параметры нужно представлять как lightuserdata потому, что они определены так: typedef UINT_PTR WPARAM; а тип double довольно опасен для больших интов. например, 0x010000000000000f при конверсии через double потеряет младшие четыре бита и приобретет пятый, которого не было, из-за округления : 0x0100000000000010
В Windows.
Антон,
самое простое - это проверить самому. Тогда и вопросы пропадут сами собой.
WPARAM для красоты тоже нужно в ligthuserdata совать, но практика показывает, что это не есть обязательно.
самое простое - это проверить самому. Тогда и вопросы пропадут сами собой.
дело в том, что я, естественно, пробовал: [url]https://github.com/untoxa/lua_quik_resources/blob/master/lua_quik_resources_main.pas[/url]
и все прекрасно работает в win7/win10 в 8 квике. по-этому я и хочу понять условия, при которых возникают проблемы. я просто их не наблюдаю, опишите, пожалуйста, свою систему. спасибо.
ps: а вот в lparam/wparam довольно часто нужно передавать указатели. первое, что приходит на ум - wm_copydata.
Если из скрипта робота понадобилось вызвать какие-либо функции WinAPI - проще всего взять готовую библиотеку-обертку.
Например, библиотеку w32 для Lua.(Библиотека есть в пакете LuaForWindows, но вариант на этом сайте содержит больше функций, кроме того содержит варианты для для QUIK 6-7 (Win32) и QUIK 8 (Win64)).
Перекомпилить w32.dll под LUA 5.3.5 x64 для QUIK 8.5.1 кто-нибудь может?
QUIK -> DDE → Lua: готовые внешние библиотеки → w32 - Вызов WinAPI функций из Lua
Форум работает на PunBB, при поддержке Informer Technologies, Inc