Здравствуйте, гость ( Вход | Регистрация )

3 страниц V  1 2 3 >  
Ответить в эту темуОткрыть новую тему
> Меню окна, подскажите плз!, Как работать с главным меню программы?
for2
сообщение 4.12.2020, 17:48
Сообщение #1


**

Neophyte
Сообщений: 25
Регистрация: 4.12.2020
Группа: Пользователи
Наличность: 0
Пользователь №: 19.817
Возраст: 17



Ребята, подскажите, куда копать! Есть программа InqSoft Window Scanner - просматривает главное меню окна любой программы, видит ID пунктов меню и позволяет на них нажимать и т.д. Как при помощи UOPilot так же работать с главным меню программы через скрипты, просматривать структуру меню и работать с дочерними окнами??
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
cirus
сообщение 5.12.2020, 3:04
Сообщение #2


**********

Elder
Сообщений: 3.480
Регистрация: 18.8.2014
Группа: Пользователи
Наличность: 26540
Пользователь №: 16.971
Возраст: 29



Меню окна
Код
--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 если нужно найти дочернее окно.
Пользователь в онлайне!Delete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
FREEON
сообщение 5.12.2020, 9:06
Сообщение #3


*****

Journeyman
Сообщений: 365
Регистрация: 14.2.2017
Группа: Пользователи
Наличность: 1319
Пользователь №: 18.346
Возраст: 25



Скорее всего имелось ввиду нажатие кнопок по их имени или id
Пользователь в онлайне!Delete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
cirus
сообщение 5.12.2020, 9:39
Сообщение #4


**********

Elder
Сообщений: 3.480
Регистрация: 18.8.2014
Группа: Пользователи
Наличность: 26540
Пользователь №: 16.971
Возраст: 29



Цитата
Скорее всего имелось ввиду нажатие кнопок по их имени или id

Любые манипуляции с окнами выполняются через sendmessage.
Пользователь в онлайне!Delete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
for2
сообщение 5.12.2020, 10:08
Сообщение #5


**

Neophyte
Сообщений: 25
Регистрация: 4.12.2020
Группа: Пользователи
Наличность: 0
Пользователь №: 19.817
Возраст: 17



Цитата(cirus @ 5.12.2020, 9:39) *

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

(IMG:https://s8.hostingkartinok.com/uploads/images/2020/12/0959a7aa699e717787d3f4e836d7132b.png)
Есть программа -1
У нее нет горячей клавиши на сохранение конфига -2
При помощи InqSoft Window Scanner я могу видеть структуру меню программы и нажать -4, чтобы начать сохранение.
Как тоже самое сделать НЕ при помощи InqSoft Window Scanner, а скриптом и горячей клавиши??
Подскажите как это реализовать через sendmessage??
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
cirus
сообщение 5.12.2020, 17:23
Сообщение #6


**********

Elder
Сообщений: 3.480
Регистрация: 18.8.2014
Группа: Пользователи
Наличность: 26540
Пользователь №: 16.971
Возраст: 29



Цитата
Есть программа -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 или выше. Горячие клавиши для запуска скрипта во вкладке 'Ещё'.
Пользователь в онлайне!Delete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
for2
сообщение 5.12.2020, 18:01
Сообщение #7


**

Neophyte
Сообщений: 25
Регистрация: 4.12.2020
Группа: Пользователи
Наличность: 0
Пользователь №: 19.817
Возраст: 17



Цитата(cirus @ 5.12.2020, 17:23) *

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

Офигительно!
Но есть нюанс. У меня программа Quik имеет кучу дочерних окон и все они раскиданы по нескольким рабочим столам через прожку Dexpot. На одном рабочем столе с Quik код работает отлично, но если запускать его с другого рабочего стола, то код уже не может найти Quik с меню. Можно ли модифицировать код??
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
cirus
сообщение 5.12.2020, 18:17
Сообщение #8


**********

Elder
Сообщений: 3.480
Регистрация: 18.8.2014
Группа: Пользователи
Наличность: 26540
Пользователь №: 16.971
Возраст: 29



Без понятия, у меня нет этой проги, используйте стандартные виртуальные столы.
Пользователь в онлайне!Delete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
for2
сообщение 5.12.2020, 19:08
Сообщение #9


**

Neophyte
Сообщений: 25
Регистрация: 4.12.2020
Группа: Пользователи
Наличность: 0
Пользователь №: 19.817
Возраст: 17



Цитата(cirus @ 5.12.2020, 18:17) *

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

Еще одна просьба, можно код, который копирует имя активного окна в буфер обмена?
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
cirus
сообщение 5.12.2020, 19:24
Сообщение #10


**********

Elder
Сообщений: 3.480
Регистрация: 18.8.2014
Группа: Пользователи
Наличность: 26540
Пользователь №: 16.971
Возраст: 29



Цитата
код, который копирует имя активного окна в буфер обмена?

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

Пользователь в онлайне!Delete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
for2
сообщение 5.12.2020, 19:34
Сообщение #11


**

Neophyte
Сообщений: 25
Регистрация: 4.12.2020
Группа: Пользователи
Наличность: 0
Пользователь №: 19.817
Возраст: 17



Цитата(cirus @ 5.12.2020, 19:24) *

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


Пишет: Неправильно указана задержка между строк..?
Да, теперь я знаю что в 10-тке есть стандартные вирт.столы )
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
cirus
сообщение 5.12.2020, 19:38
Сообщение #12


**********

Elder
Сообщений: 3.480
Регистрация: 18.8.2014
Группа: Пользователи
Наличность: 26540
Пользователь №: 16.971
Возраст: 29



Цитата
Пишет: Неправильно указана задержка между строк..?

Этот код не может такого писать.
Пользователь в онлайне!Delete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
for2
сообщение 5.12.2020, 19:46
Сообщение #13


**

Neophyte
Сообщений: 25
Регистрация: 4.12.2020
Группа: Пользователи
Наличность: 0
Пользователь №: 19.817
Возраст: 17



Цитата(cirus @ 5.12.2020, 19:38) *

Этот код не может такого писать.

(IMG:https://s8.hostingkartinok.com/uploads/images/2020/12/056fa3c4c102c32fecf1c4cfa3c29ca6.png)

Да, это пишет пилот, но я как дилетант не знаю что с этим делать
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
cirus
сообщение 5.12.2020, 19:50
Сообщение #14


**********

Elder
Сообщений: 3.480
Регистрация: 18.8.2014
Группа: Пользователи
Наличность: 26540
Пользователь №: 16.971
Возраст: 29



А первую строку копировать кто будет?
Код
--lua
Пользователь в онлайне!Delete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
for2
сообщение 5.12.2020, 19:56
Сообщение #15


**

Neophyte
Сообщений: 25
Регистрация: 4.12.2020
Группа: Пользователи
Наличность: 0
Пользователь №: 19.817
Возраст: 17



Цитата(cirus @ 5.12.2020, 19:50) *

А первую строку копировать кто будет?
Код
--lua


мля.. )
Замечательно! Наверное это не последняя просьба..
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
cirus
сообщение 5.12.2020, 20:05
Сообщение #16


**********

Elder
Сообщений: 3.480
Регистрация: 18.8.2014
Группа: Пользователи
Наличность: 26540
Пользователь №: 16.971
Возраст: 29



Цитата
Наверное это не последняя просьба..

Смотрите примеры тут: https://uopilot.uokit.com/wiki/index.php?ti...к_функций_(Lua)
Если что-то непонятно, то поможем.


Пользователь в онлайне!Delete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
for2
сообщение 5.12.2020, 20:07
Сообщение #17


**

Neophyte
Сообщений: 25
Регистрация: 4.12.2020
Группа: Пользователи
Наличность: 0
Пользователь №: 19.817
Возраст: 17



Цитата(cirus @ 5.12.2020, 20:05) *

Если что-то непонятно, то поможем.

Благодарю, это важно..
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
for2
сообщение 6.12.2020, 6:09
Сообщение #18


**

Neophyte
Сообщений: 25
Регистрация: 4.12.2020
Группа: Пользователи
Наличность: 0
Пользователь №: 19.817
Возраст: 17



Цитата(cirus @ 5.12.2020, 17:23) *

код
Код
--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 или выше. Горячие клавиши для запуска скрипта во вкладке 'Ещё'.


(IMG:https://s8.hostingkartinok.com/uploads/images/2020/12/b2f96bdd5a82f21d51eccd64f9e7b6c6.png)

В конце кода, требуется ещё
- нажать "Сохранить",
- затем подтвердить перезапись существующего файла
-вывести какое-нибудь сообщение в углу на пару секунд об удачном сохранении

Пжл, допишите код??

И ещё такая просьба,
На сколько сложно реализовать сортировку окон по рабочим столам, т.к. после перезагрузки получается свалка на столе №1.
Например, есть 6 рабочих столов.
Код должен сканировать все рабочие столы и сортировать окна по конкретным столам.
Вот правила перемещения окон на рабочие столы:
(IMG:https://s8.hostingkartinok.com/uploads/images/2020/12/0690545a03a2c52df6f0df1ae2dfafb8.png)
Если можете, помогине пожалуйста с кодом
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
cirus
сообщение 6.12.2020, 13:57
Сообщение #19


**********

Elder
Сообщений: 3.480
Регистрация: 18.8.2014
Группа: Пользователи
Наличность: 26540
Пользователь №: 16.971
Возраст: 29



Цитата
В конце кода, требуется ещё
- нажать "Сохранить",
- затем подтвердить перезапись существующего файла
-вывести какое-нибудь сообщение в углу на пару секунд об удачном сохранении

код
Код
--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);
    int FindWindowExA(int hWndParent, int hWndChildAfter, const char* lpszClass, const char* lpszWindow);
]]
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) -- отправить сообщение пункту меню

            -- поиск окна сохранения настроек
            local timeout = os.clock() + 3   -- 3 секунды ожидание появления окна
            local save_settings
            repeat
                save_settings = findwindow ("Выберите файл для сохранения текущих настроек")
                wait (10)
            until save_settings  or os.clock() > timeout
            if os.clock() >= timeout then  -- окно с настройками не открылось
                log('Окно сохранения настроек не найдено')
                end_script()
            end

            -- поиск кнопки сохранения настроек
            local save_button = ffi.C.FindWindowExA(save_settings[1][1], 0, 'Button', 'Со&хранить')
            if save_button ~= 0 then
                workwindow(save_button)
                left (10, 10)    -- клик на кнопку
            else
                log('Кнопка Сохранить не найдена')
                end_script()
            end

            -- поиск окна для подтверждения сохранения настроек
            local confirm_save
            timeout = os.clock() + 3
            repeat
                confirm_save = findwindow ("Подтвердить сохранение в виде")
                wait (10)
            until confirm_save or os.clock() > timeout
            if os.clock() >= timeout then
                log('Окно подтверждения настроек не найдено')
                end_script()
            end

            -- поиск кнопки Да
            local temp =  getwindow (confirm_save[1][1], 'CHILD')
            local temp2 = ffi.C.FindWindowExA(temp, 0, 'CtrlNotifySink', nil)
            local yes_button=ffi.C.FindWindowExA(temp2, 0, 'Button', '&Да')
            if yes_button == 0 then
                while temp2 ~= 0 do
                    temp2 = ffi.C.FindWindowExA(temp, temp2, 'CtrlNotifySink', nil)
                    yes_button=ffi.C.FindWindowExA(temp2, 0, 'Button', '&Да')
                    if yes_button ~=0 then break end
                end
            end
            if yes_button ~= 0 then
                workwindow(yes_button)
                left (10, 10)    -- клик на кнопку
            else
                log('Кнопка Да не найдена')
                end_script()
            end

            hint ('Готово')
        else
            log('Не получен хенд подменю или id итема подменю')
        end
    else
        log('У окна нет меню')
    end
else
    log('Окно не найдено')
end

Цитата
На сколько сложно реализовать сортировку окон по рабочим столам

Не знаю какая функция winapi выполняет перемещение окна на другой рабочий стол.
Пользователь в онлайне!Delete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
for2
сообщение 6.12.2020, 15:00
Сообщение #20


**

Neophyte
Сообщений: 25
Регистрация: 4.12.2020
Группа: Пользователи
Наличность: 0
Пользователь №: 19.817
Возраст: 17



Цитата(cirus @ 6.12.2020, 13:57) *


Не знаю какая функция winapi выполняет перемещение окна на другой рабочий стол.

Супер, спасибо, сохранение работает очень быстро!
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения

3 страниц V  1 2 3 >
Ответить в эту темуОткрыть новую тему
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 

- Текстовая версия | Версия для КПК Сейчас: 28.3.2024, 14:37
Designed by Nickostyle