51

Re: w32 - Вызов WinAPI функций из Lua

Добрый день!
Подскажите, пожалуйста, есть возможность сделать окно таблицы робота поверх всех окон?
Пытался посылать Alt_T   Quik-у, но ничего не происходит.
Плиз, хелп.

52

Re: w32 - Вызов WinAPI функций из Lua

Michael1976, речь про таблицу, созданную из скрипта Lua, я верно понял ваш вопрос?

53

Re: w32 - Вызов WinAPI функций из Lua

Да. Спасибо!

54

Re: w32 - Вызов WinAPI функций из 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, проверить корректность указанного заголовка.

У меня точно работает этот скрипт.

55 (2019-02-11 19:33:20 отредактировано Michael1976)

Re: w32 - Вызов WinAPI функций из Lua

Огромное Вам спасибо!!! 
Работает. 


У меня было 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)
Как до нее можно додуматься/где почитать?

56

Re: w32 - Вызов WinAPI функций из Lua

Смотреть какие окна и в какой иерархии созданы процессами и какие сообщения к ним прилетают помогает утилита Spy++ от Microsoft. Она идёт в составе любой Visual Studio, но и отдельно наверняка её не сложно сыскать.
Я просто посмотрел какие сообщению идут окну при нажатии Alt+T. Не с первого подхода - но нашел подходящее.
Расшифровать 0x0EFFF не берусь, было просто подсмотрено через Spy.

57

Re: w32 - Вызов WinAPI функций из Lua

Еще раз большое Вам спасибо, что так доходчиво все объяснили!

58

Re: w32 - Вызов WinAPI функций из Lua

можно прямую ссылку на аналог w32.dll для 8 Квика скинуть. что-то туплю...

59

Re: w32 - Вызов WinAPI функций из Lua

Michael1976 пишет:

Огромное Вам спасибо!!! 
Подскажите, пожалуйста, а 0x0EFFF - это что за команда?
w32.PostMessage(hWndLua, WM_SYSCOMMAND, 0x0EFFF, 0)
Как до нее можно додуматься/где почитать?

про wm_syscommand - в msdn, про 0x0efff - в ресурсах квика (файл lang_res.dll). конкретно эта константа вот:

MENUITEM "&Поверх всех окон",  61439

61439 это и есть искомая константа. просто эмулируется выбор пункта системного меню.

60

Re: w32 - Вызов WinAPI функций из Lua

toxa пишет:

MENUITEM "&Поверх всех окон",  61439
61439 это и есть искомая константа. просто эмулируется выбор пункта системного меню.

Спасибо, это в самом деле хорошая находка!

61

Re: w32 - Вызов WinAPI функций из Lua

ну не то чтобы это находка, это же очевидные вещи. вообще, вы спрашивайте, я про квик почти все знаю.

62

Re: w32 - Вызов WinAPI функций из Lua

Самую главную функцию забыли в w32: GetCurrentProcessId().

Re: w32 - Вызов WinAPI функций из Lua

А для 8-го квика есть w32?

64

Re: w32 - Вызов WinAPI функций из Lua

Дядя_Фёдор пишет:

А для 8-го квика есть w32?

да. в первом сообщении этой темы.

Re: w32 - Вызов WinAPI функций из Lua

toxa пишет:
Дядя_Фёдор пишет:

А для 8-го квика есть w32?

да. в первом сообщении этой темы.

Спасибо. Нашел, ура.

66

Re: w32 - Вызов WinAPI функций из Lua

Скажите, как надо поправить первое сообщение, чтобы из него сразу всё было понятно? Я сейчас серьёзно спрашиваю. наверняка оно написано не очень понятно.

67

Re: w32 - Вызов WinAPI функций из Lua

имхо, что-то вроде "архив с готовой библиотекой w32.dll для QUIK7 и QUIK8". и, чтобы два раза не вставать, добавьте GetCurrentProcessId() для того, чтобы можно было сопоставить, например, найденное окно логина конкретному процессу квика, а то GetWindowThreadProcessID есть, но его не с чем сравнить.

68

Re: w32 - Вызов WinAPI функций из Lua

swerg пишет:

Подобрал )

-- скрипт при запуске переключает режим для окна "поверх всех" (вкл/выкл)
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 квике не фурычит.

69

Re: w32 - Вызов WinAPI функций из Lua

библиотечные функции должны выглядеть так, чтобы оно работало:

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);
}

70

Re: w32 - Вызов WinAPI функций из Lua

s_mike пишет:

lua_pushlightuserdata(L,FindWindowEx());

для того чтобы хендл представить в виде указателя, чтобы типа не потерялся старший dword? должно и без этого работать: [url]https://docs.microsoft.com/ru-ru/windows/win32/winprog64/interprocess-communication?redirectedfrom=MSDN[/url]

71

Re: w32 - Вызов WinAPI функций из Lua

Без этого не работает. Иначе бы я не полез сюда.

72 (2020-03-07 23:15:38 отредактировано toxa)

Re: w32 - Вызов WinAPI функций из Lua

s_mike пишет:

Без этого не работает. Иначе бы я не полез сюда.

запускаете под wine в линуксе?
ps: тогда уж и все остальные параметры нужно представлять как lightuserdata потому, что они определены так: typedef UINT_PTR WPARAM; а тип double довольно опасен для больших интов. например, 0x010000000000000f при конверсии через double потеряет младшие четыре бита и приобретет пятый, которого не было, из-за округления : 0x0100000000000010

73 (2020-03-08 02:01:23 отредактировано s_mike)

Re: w32 - Вызов WinAPI функций из Lua

В Windows.



Антон,

самое простое - это проверить самому. Тогда и вопросы пропадут сами собой.

WPARAM для красоты тоже нужно в ligthuserdata совать, но практика показывает, что это не есть обязательно.

74 (2020-03-08 21:14:00 отредактировано toxa)

Re: w32 - Вызов WinAPI функций из Lua

s_mike пишет:

самое простое - это проверить самому. Тогда и вопросы пропадут сами собой.

дело в том, что я, естественно, пробовал: [url]https://github.com/untoxa/lua_quik_resources/blob/master/lua_quik_resources_main.pas[/url]
и все прекрасно работает в win7/win10 в 8 квике. по-этому я и хочу понять условия, при которых возникают проблемы. я просто их не наблюдаю, опишите, пожалуйста, свою систему. спасибо.
ps: а вот в lparam/wparam довольно часто нужно передавать указатели. первое, что приходит на ум - wm_copydata.

75

Re: w32 - Вызов WinAPI функций из Lua

swerg пишет:

Если из скрипта робота понадобилось вызвать какие-либо функции WinAPI - проще всего взять готовую библиотеку-обертку.
Например, библиотеку w32 для Lua.

(Библиотека есть в пакете LuaForWindows, но вариант на этом сайте содержит больше функций, кроме того содержит варианты для для QUIK 6-7 (Win32) и QUIK 8 (Win64)).

Перекомпилить w32.dll под LUA 5.3.5 x64 для QUIK 8.5.1 кто-нибудь может?