|
Меню окна, подскажите плз!, Как работать с главным меню программы? |
|
|
Ответов(1 - 19)
cirus |
5.12.2020, 3:04
|
Elder
Сообщений: 3.480
Регистрация: 18.8.2014 Группа: Пользователи Наличность: 26746
Пользователь №: 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 если нужно найти дочернее окно.
|
|
|
|
for2 |
5.12.2020, 10:08
|
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??
|
|
|
|
cirus |
5.12.2020, 17:23
|
Elder
Сообщений: 3.480
Регистрация: 18.8.2014 Группа: Пользователи Наличность: 26746
Пользователь №: 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 или выше. Горячие клавиши для запуска скрипта во вкладке 'Ещё'.
|
|
|
|
for2 |
5.12.2020, 18:01
|
Neophyte
Сообщений: 25
Регистрация: 4.12.2020 Группа: Пользователи Наличность: 0
Пользователь №: 19.817
Возраст: 17
|
Цитата(cirus @ 5.12.2020, 17:23) Пилот версии 2.41 или выше. Горячие клавиши для запуска скрипта во вкладке 'Ещё'.
Офигительно! Но есть нюанс. У меня программа Quik имеет кучу дочерних окон и все они раскиданы по нескольким рабочим столам через прожку Dexpot. На одном рабочем столе с Quik код работает отлично, но если запускать его с другого рабочего стола, то код уже не может найти Quik с меню. Можно ли модифицировать код??
|
|
|
|
for2 |
5.12.2020, 19:34
|
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-тке есть стандартные вирт.столы )
|
|
|
|
for2 |
5.12.2020, 19:56
|
Neophyte
Сообщений: 25
Регистрация: 4.12.2020 Группа: Пользователи Наличность: 0
Пользователь №: 19.817
Возраст: 17
|
Цитата(cirus @ 5.12.2020, 19:50) А первую строку копировать кто будет? Код мля.. ) Замечательно! Наверное это не последняя просьба..
|
|
|
|
for2 |
6.12.2020, 6:09
|
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) Если можете, помогине пожалуйста с кодом
|
|
|
|
cirus |
6.12.2020, 13:57
|
Elder
Сообщений: 3.480
Регистрация: 18.8.2014 Группа: Пользователи Наличность: 26746
Пользователь №: 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 выполняет перемещение окна на другой рабочий стол.
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|