UoKit.com Форумы > Кликер > UO Pilot
Страницы: 1, 2, 3, 4, 5
for2
Ребята, подскажите, куда копать! Есть программа InqSoft Window Scanner - просматривает главное меню окна любой программы, видит ID пунктов меню и позволяет на них нажимать и т.д. Как при помощи UOPilot так же работать с главным меню программы через скрипты, просматривать структуру меню и работать с дочерними окнами??
Вверх
cirus
Меню окна
Код
--lua
local GA_ROOTOWNER = 3
local MF_BYPOSITION = 0x00000400
local ffi = require("ffi")

ffi.cdef[[
    int GetMenu(int hwnd);
    int GetAncestor(int hwnd, unsigned int gaFlags);
    int GetMenuItemCount(int hmenu);
    int GetMenuStringA(int hmenu, unsigned int idItem, char* lpsz, int cbMax, unsigned int fuFlags);
]]


-- Ctrl+A привязка к окну, можно проверить на окне пилота или блокнота
log 'clear' log 'mode compact'
local h_menu = ffi.C.GetMenu(ffi.C.GetAncestor(workwindow(), GA_ROOTOWNER))
if h_menu > 0 then
    local count_menu_item = ffi.C.GetMenuItemCount(h_menu)
    log('Количество элементов в меню: ' .. tostring(count_menu_item))

    for i=0, count_menu_item-1 do
        local len_str = ffi.C.GetMenuStringA(h_menu, i, nil, 0, MF_BYPOSITION)
        local name_item = ffi.new('char[?]', len_str+1)
        ffi.C.GetMenuStringA(h_menu, i, name_item, ffi.sizeof(name_item), MF_BYPOSITION)
        log(ffi.string(name_item))
    end
else
    log('У окна нет меню')
end

Цитата
и работать с дочерними окнами

Что именно хотите сделать? Getwindow если нужно найти дочернее окно.
Вверх
FREEON
Скорее всего имелось ввиду нажатие кнопок по их имени или id
Вверх
cirus
Цитата
Скорее всего имелось ввиду нажатие кнопок по их имени или id

Любые манипуляции с окнами выполняются через sendmessage.
Вверх
for2
Цитата(cirus @ 5.12.2020, 9:39)

Любые манипуляции с окнами выполняются через sendmessage.


Есть программа -1
У нее нет горячей клавиши на сохранение конфига -2
При помощи InqSoft Window Scanner я могу видеть структуру меню программы и нажать -4, чтобы начать сохранение.
Как тоже самое сделать НЕ при помощи InqSoft Window Scanner, а скриптом и горячей клавиши??
Подскажите как это реализовать через sendmessage??
Вверх
cirus
Цитата
Есть программа -1
У нее нет горячей клавиши на сохранение конфига -2
При помощи InqSoft Window Scanner я могу видеть структуру меню программы и нажать -4, чтобы начать сохранение.
Как тоже самое сделать НЕ при помощи InqSoft Window Scanner, а скриптом и горячей клавиши??

код
Код
--lua
local WM_COMMAND = 0x0111
local ffi = require("ffi")
ffi.cdef[[
    int GetMenu(int hwnd);
    int GetSubMenu(int hMenu, int nPos);
    unsigned int GetMenuItemID(int hMenu, int nPos);
    int PostMessageA(int hWnd, unsigned int Msg, unsigned int wParam, long lParam);
]]
log 'clear' log 'mode compact'

local handle = findwindow ("QUIK")  -- имя окна (можно указать часть имени)
if handle then   -- если окно найдено
    local h_menu = ffi.C.GetMenu(handle[1][1])   -- получить хендл меню окна
    if h_menu > 0 then     -- если меню есть
        local h_submenu = ffi.C.GetSubMenu(h_menu, 0)  -- получить хендл подменю, первого по порядку (для QUIK это 'Система')
        local id_item = ffi.C.GetMenuItemID(h_submenu, 5)  -- получить id итема подменю, шестого по порядку (для QUIK это 'Сохранить настройки в файл')
        if h_submenu and id_item then    -- если существуют
            ffi.C.PostMessageA(handle[1][1], WM_COMMAND, id_item, 0) -- отправить сообщение пункту меню
        else
            log('Не получен хенд подменю или id итема подменю')
        end
    else
        log('У окна нет меню')
    end
else
    log('Окно не найдено')
end

Пилот версии 2.41 или выше. Горячие клавиши для запуска скрипта во вкладке 'Ещё'.
Вверх
for2
Цитата(cirus @ 5.12.2020, 17:23)

Пилот версии 2.41 или выше. Горячие клавиши для запуска скрипта во вкладке 'Ещё'.

Офигительно!
Но есть нюанс. У меня программа Quik имеет кучу дочерних окон и все они раскиданы по нескольким рабочим столам через прожку Dexpot. На одном рабочем столе с Quik код работает отлично, но если запускать его с другого рабочего стола, то код уже не может найти Quik с меню. Можно ли модифицировать код??
Вверх
cirus
Без понятия, у меня нет этой проги, используйте стандартные виртуальные столы.
Вверх
for2
Цитата(cirus @ 5.12.2020, 18:17)

Без понятия, у меня нет этой проги, используйте стандартные виртуальные столы.

Еще одна просьба, можно код, который копирует имя активного окна в буфер обмена?
Вверх
cirus
Цитата
код, который копирует имя активного окна в буфер обмена?

Код
--lua
wait(3000)  -- пауза 3 секунды (можно убрать)
local name_active_window = getwindowtext(getwindow(0))  -- получить имя активного окна
clipboard (name_active_window)  -- скопировать в буфер обмена
hint (name_active_window)   -- подсказка в левом нижнем углу (можно убрать)


Вверх
Invision Power Board © 2001-2024 Invision Power Services, Inc.
Version for Pocket PC © 2006-2024, IPBest Studio.