|
|
|
Функция ShowWindow, Срабатывает не всегда ShowWindow #win TOP |
|
|
фонарик |
26.8.2021, 20:35
|
Apprentice
Сообщений: 145
Регистрация: 23.11.2011 Группа: Пользователи Наличность: 0
Пользователь №: 14.305
|
Окошки все работают, вручную можно переключить на передний план. Такая проблема возникает не всегда, но довольно-таки часто. Проблема явно не в компьютере, ибо на 3 разных ноутбуках она встречается с одинаковой регулярностью. Если происходит глюк, то застрявшее окошко можно свернуть в трей той же ShowWindow, потом развернуть. Но сама игра как-то странно реагирует на такие действия, за сим их применять нельзя. Можно переключить вручную, клацнув на закладку окошка на панели задач. Может кто знает, команда ShowWindow на луа полностью аналогичная? Скрипт у меня в принципе не большой, можно было бы и переписать на луа. Или может где плагин есть для манипуляций с окнами? Из-за чего вообще такое происходит (IMG: style_emoticons/default/unsure.gif)
|
|
|
|
31ost |
1.9.2021, 19:55
|
Neophyte
Сообщений: 24
Регистрация: 26.10.2017 Группа: Пользователи Наличность: 0
Пользователь №: 18.658
Возраст: 30
|
Цитата(фонарик @ 26.8.2021, 12:03) Подскажите пожалуйста, как можно решить проблему. Есть окошки игры много штук, все одинаковые, друг поверх друга. Скрипт периодически выводит поочерёдно эти окошки поверх экрана чтобы проверить как там дела. Но иногда рабочее окошко не выводится на передний план, вместо этого окошко просто моргает другим цветом на панели задач (IMG: style_emoticons/default/sad.gif) Повторные попытки повторять одну и ту же команду к успеху не приводят, вместо передвижения окошка на передний план оно моргает на панели задач, так никуда и не передвигаясь. У меня вроде как появилась аналогичная проблема, буд-то с окнами что-то поломалось и не находит какие-то и курсор уводит всегда в одно место, а когда вручную нажимаю ктрл+а, то id окна имеет отличающийся от других - большое кол-во цифр. Методом тыка выяснил, что проблема появляется только тогда, когда запускается программа - SAM piker. Не знаю что этот SAM piker творит, но если его не запускать, то и проблемы этой нету и тут дилемма вылезает - недостаточно знаний чтобы решить проблему и хочется часы понакручивать, пока програмка работает.
|
|
|
|
cirus |
26.9.2021, 19:43
|
Elder
Сообщений: 3.480
Регистрация: 18.8.2014 Группа: Пользователи Наличность: 26540
Пользователь №: 16.971
Возраст: 29
|
Цитата найти окно по классу? Поиск окна по классу
Код --lua local ffi = require("ffi") ffi.cdef[[ typedef const char *LPCSTR; struct HWND__ { int unused; }; typedef struct HWND__ *HWND; HWND FindWindowExA (HWND hWndParent, HWND hWndChildAfter, LPCSTR lpszClass, LPCSTR lpszWindow); ]]
function _FindWindow(name, class, name_child, class_child) local h = ffi.C.FindWindowExA(nil, nil, class or nil, name or nil) if tonumber(ffi.cast('int', h)) > 0 then if name_child or class_child then h = ffi.C.FindWindowExA(h, nil, class_child or nil, name_child or nil) end return tonumber(ffi.cast('int', h)) end return nil end
-- Найти окно блокнота log 'clear' log 'mode compact' local handle = _FindWindow(nil, 'Notepad', nil, nil) -- имя окна, класс окна, имя дочернего окна, класс дочернего окна if handle then log (handle) else log ('Окно не найдено') end
-- Найти окно редактора блокнота local handle = _FindWindow(nil, 'Notepad', nil, 'Edit') -- имя окна, класс окна, имя дочернего окна, класс дочернего окна if handle then log (handle) else log ('Окно не найдено') end
|
|
|
|
cirus |
26.9.2021, 20:50
|
Elder
Сообщений: 3.480
Регистрация: 18.8.2014 Группа: Пользователи Наличность: 26540
Пользователь №: 16.971
Возраст: 29
|
Цитата как получить массив с этими окнами? Поиск окон
Код --lua local ffi = require("ffi") ffi.cdef[[ typedef const char *LPCSTR; struct HWND__ { int unused; }; typedef struct HWND__ *HWND; HWND FindWindowExA (HWND hWndParent, HWND hWndChildAfter, LPCSTR lpszClass, LPCSTR lpszWindow); ]]
function _FindWindow(name, class, name_child, class_child) local ListWindow = {} local h = ffi.C.FindWindowExA(nil, nil, class or nil, name or nil) while tonumber(ffi.cast('int', h)) > 0 do local child = nil if name_child or class_child then child = ffi.C.FindWindowExA(h, nil, class_child or nil, name_child or nil) end if child then ListWindow[#ListWindow+1] = tonumber(ffi.cast('int', child)) else ListWindow[#ListWindow+1] = tonumber(ffi.cast('int', h)) end h = ffi.C.FindWindowExA(nil, h, class or nil, name or nil) end
if #ListWindow > 0 then return ListWindow end return nil end
-- Найти окна всех блокнотов log 'clear' log 'mode compact' local handle = _FindWindow(nil, 'Notepad', nil, nil) -- имя окна, класс окна, имя дочернего окна, класс дочернего окна if handle then log ("Найдено окон: " .. tostring(#handle)) log (table.concat(handle, '\r\n')) else log ('Окно не найдено') end
-- Найти окно редактора всех блокнотов local handle = _FindWindow(nil, 'Notepad', nil, 'Edit') -- имя окна, класс окна, имя дочернего окна, класс дочернего окна if handle then log ("Найдено окон: " .. tostring(#handle)) log (table.concat(handle, '\r\n')) else log ('Окно не найдено') end
|
|
|
|
фонарик |
26.9.2021, 22:46
|
Apprentice
Сообщений: 145
Регистрация: 23.11.2011 Группа: Пользователи Наличность: 0
Пользователь №: 14.305
|
Опять незадача: а как теперь воспользоваться вашим плагином Prompt? Не хочет он теперь работать (IMG: style_emoticons/default/sad.gif) Код -- Находим окна игры log 'clear' log 'mode compact' WindowsArr = {} local handle = _FindWindow(nil, 'Game Engine', nil, nil) -- имя окна, класс окна, имя дочернего окна, класс дочернего окна for x = 1, #handle do local a=getwindowtext (handle[x]) -- получить заголовок рабочего окна (нужна привязка) table.insert(WindowsArr, a) -- создаем массив WindowsArr из заголовков окон
end А дальше при попытке им воспользоваться Цитата h = require'prompt' выдается ошибка (IMG:https://i115.fastpic.org/big/2021/0926/d2/fd392c406405d254c76c2f2f9d02a1d2.jpg) Не хочется думать что совместить эти 2 ваших приёма не получится (IMG: style_emoticons/default/sad.gif) Товарищ cirus, что вы думаете на этот счёт?
|
|
|
|
фонарик |
26.9.2021, 23:23
|
Apprentice
Сообщений: 145
Регистрация: 23.11.2011 Группа: Пользователи Наличность: 0
Пользователь №: 14.305
|
|
|
|
|
cirus |
26.9.2021, 23:27
|
Elder
Сообщений: 3.480
Регистрация: 18.8.2014 Группа: Пользователи Наличность: 26540
Пользователь №: 16.971
Возраст: 29
|
Всё работает. код
Код --lua local ffi = require("ffi") local h = require'prompt' ffi.cdef[[ HWND FindWindowExA (HWND hWndParent, HWND hWndChildAfter, LPCSTR lpszClass, LPCSTR lpszWindow); ]]
function _FindWindow(name, class, name_child, class_child) local ListWindow = {} local h = ffi.C.FindWindowExA(nil, nil, class or nil, name or nil) while tonumber(ffi.cast('int', h)) > 0 do local child = nil if name_child or class_child then child = ffi.C.FindWindowExA(h, nil, class_child or nil, name_child or nil) end if child then ListWindow[#ListWindow+1] = tonumber(ffi.cast('int', child)) else ListWindow[#ListWindow+1] = tonumber(ffi.cast('int', h)) end h = ffi.C.FindWindowExA(nil, h, class or nil, name or nil) end
if #ListWindow > 0 then return ListWindow end return nil end
log 'clear' log 'mode compact' -- Найти окна всех блокнотов local handle = _FindWindow(nil, 'Notepad', nil, nil) -- имя окна, класс окна, имя дочернего окна, класс дочернего окна if handle then log ("Найдено окон: " .. tostring(#handle)) log (table.concat(handle, '\r\n')) else log ('Окно не найдено') end
-- установить позицию окна h.promptposX = 500 h.promptposY = 300 -- вывод окна с вариантами выбора local result = h.lua_prompt('первый', 'второй выбор', 'третий') hint (result) if result == 0 then log('Ничего не выбрано') end if result == 1 then log('Выбран пункт 1') end if result == 2 then log('Выбран пункт 2') end if result == 3 then log('Выбран пункт 3') end
|
|
|
|
фонарик |
26.9.2021, 23:32
|
Apprentice
Сообщений: 145
Регистрация: 23.11.2011 Группа: Пользователи Наличность: 0
Пользователь №: 14.305
|
Цитата(cirus @ 26.9.2021, 23:27) Всё работает. Даа! если Код local h = require'prompt' перенести наверх как у вас в примере то всё работает! Товарищ cirus, большое вам спасибо за помощь, ваши знания и советами, что поделились (IMG: style_emoticons/default/smile.gif)
|
|
|
|
|
|
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0
|
|