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

 
Ответить в эту темуОткрыть новую тему
> Функция ShowWindow, Срабатывает не всегда ShowWindow #win TOP
фонарик
сообщение 26.8.2021, 12:03
Сообщение #1


****

Apprentice
Сообщений: 145
Регистрация: 23.11.2011
Группа: Пользователи
Наличность: 0
Пользователь №: 14.305



Подскажите пожалуйста, как можно решить проблему. Есть окошки игры много штук, все одинаковые, друг поверх друга. Скрипт периодически выводит поочерёдно эти окошки поверх экрана чтобы проверить как там дела. Но иногда рабочее окошко не выводится на передний план, вместо этого окошко просто моргает другим цветом на панели задач (IMG:style_emoticons/default/sad.gif) Повторные попытки повторять одну и ту же команду к успеху не приводят, вместо передвижения окошка на передний план оно моргает на панели задач, так никуда и не передвигаясь.
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
BlackBot
сообщение 26.8.2021, 12:15
Сообщение #2


**

Neophyte
Сообщений: 33
Регистрация: 17.8.2021
Группа: Пользователи
Наличность: 0
Пользователь №: 20.047



я так работаю с окнами игры
Код

log clear //чистим лог
log mode compact // Вид окна лога

set %handle findwindow ("Northern")      // ищем окна игры по слову
set #n size(%handle)   // количество запущенных окон игры

if #n = 0
    log Окна не найдены, скрипт остановлен
    end_script
end_if

hint найдено #n игровых окон
for #i 1 #n   // цикл для всех окон
    showwindow %handle[#i 1]     // показывать окно
    set workwindow %handle[#i 1] // делаем окно активным
    wait 2500 + random (1000)     // пауза 2 секунды
        // необходимые действия с окном игры
end_for
end_if
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Madeus
сообщение 26.8.2021, 16:57
Сообщение #3


****

Apprentice
Сообщений: 282
Регистрация: 19.11.2019
Группа: Пользователи
Наличность: 8296
Пользователь №: 19.451
Возраст: 32



Может окно зависло "не отвечает" в диспетчере проверь.
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
фонарик
сообщение 26.8.2021, 20:35
Сообщение #4


****

Apprentice
Сообщений: 145
Регистрация: 23.11.2011
Группа: Пользователи
Наличность: 0
Пользователь №: 14.305



Окошки все работают, вручную можно переключить на передний план. Такая проблема возникает не всегда, но довольно-таки часто. Проблема явно не в компьютере, ибо на 3 разных ноутбуках она встречается с одинаковой регулярностью.

Если происходит глюк, то застрявшее окошко можно свернуть в трей той же ShowWindow, потом развернуть. Но сама игра как-то странно реагирует на такие действия, за сим их применять нельзя. Можно переключить вручную, клацнув на закладку окошка на панели задач.

Может кто знает, команда ShowWindow на луа полностью аналогичная? Скрипт у меня в принципе не большой, можно было бы и переписать на луа. Или может где плагин есть для манипуляций с окнами? Из-за чего вообще такое происходит (IMG:style_emoticons/default/unsure.gif)
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
cirus
сообщение 27.8.2021, 1:43
Сообщение #5


**********

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



Цитата
команда ShowWindow на луа полностью аналогичная?

Да. Можно использовать SetForegroundWindow.
Код
--lua
local ffi = require("ffi")
ffi.cdef[[
    struct HWND__ { int unused; }; typedef struct HWND__ *HWND;
    bool SetForegroundWindow(HWND hWnd);
]]
function _SetForegroundWindow(handle)
    ffi.C.SetForegroundWindow(ffi.cast('HWND', handle))
end

_SetForegroundWindow(workwindow())  -- вытащить рабочее окно на передний план
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
sutra
сообщение 27.8.2021, 12:01
Сообщение #6


*******

Adept
Сообщений: 923
Регистрация: 10.8.2018
Группа: Пользователи
Наличность: 0
Пользователь №: 19.007



У меня в своё время была точно такая же проблема. Хоть в Пилоте, хоть на lua. Причём при старте скрипта всегда 100% работает, а вот потом начинаются проблемы. Конечно же я не искал каждый раз окна по новой и соответственно не проверял как работает в этом случае. Попробуй как Cirus предлагает через ffi (на тот момент я понятия не имел о такой возможности). А тогда обходил это глюк тыкая kleft-ом - неудобно, криво, мешает заниматься другими делами, но работало 100% только так. Да, это на WIN 7, как на 10-ке я не знаю.
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
фонарик
сообщение 28.8.2021, 11:24
Сообщение #7


****

Apprentice
Сообщений: 145
Регистрация: 23.11.2011
Группа: Пользователи
Наличность: 0
Пользователь №: 14.305



sutra, всё верно, 1 в 1 как у меня описали проблему. kleftом клацать я недопетрил, надо будет попробовать насколько это будет мешать всему остальному.

cirus, спасибо вам в очередной раз за совет и помощь. Вы прям как бальзам от всех скриптовых проблем (IMG:style_emoticons/default/thanks.gif) Буду пробовать ваш метод.
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
31ost
сообщение 1.9.2021, 19:55
Сообщение #8


**

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 творит, но если его не запускать, то и проблемы этой нету и тут дилемма вылезает - недостаточно знаний чтобы решить проблему и хочется часы понакручивать, пока програмка работает.
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
фонарик
сообщение 26.9.2021, 19:12
Сообщение #9


****

Apprentice
Сообщений: 145
Регистрация: 23.11.2011
Группа: Пользователи
Наличность: 0
Пользователь №: 14.305



Товарищ cirus, а есть возможность вашим методом найти окно по классу? На простом языке пилота есть плагин у товарища DarkMaster, но на луа я не нашел варианта (IMG:style_emoticons/default/unsure.gif) У вас ведь есть решения на все случаи жизни (IMG:style_emoticons/default/laugh.gif)
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
cirus
сообщение 26.9.2021, 19:43
Сообщение #10


**********

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
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
фонарик
сообщение 26.9.2021, 20:14
Сообщение #11


****

Apprentice
Сообщений: 145
Регистрация: 23.11.2011
Группа: Пользователи
Наличность: 0
Пользователь №: 14.305



Да! Работает! (IMG:style_emoticons/default/yahoo.gif) Но возникла проблема: а если окон много с одинаковым классом, как получить массив с этими окнами? Подскажите пожалуйста (IMG:style_emoticons/default/unsure.gif)
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
cirus
сообщение 26.9.2021, 20:50
Сообщение #12


**********

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
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
фонарик
сообщение 26.9.2021, 22:07
Сообщение #13


****

Apprentice
Сообщений: 145
Регистрация: 23.11.2011
Группа: Пользователи
Наличность: 0
Пользователь №: 14.305



cirus, вы просто волшебник, как хорошо что такие ребята есть на этом форуме (IMG:style_emoticons/default/cool.gif) Всё работает лучшим образом, спасибо вам огромное (IMG:style_emoticons/default/thanks.gif)
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
фонарик
сообщение 26.9.2021, 22:46
Сообщение #14


****

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, что вы думаете на этот счёт?
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
cirus
сообщение 26.9.2021, 23:07
Сообщение #15


**********

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



Убрать из скрипта эти строки:
Код
typedef const char *LPCSTR;
struct HWND__ { int unused; }; typedef struct HWND__ *HWND;
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
фонарик
сообщение 26.9.2021, 23:23
Сообщение #16


****

Apprentice
Сообщений: 145
Регистрация: 23.11.2011
Группа: Пользователи
Наличность: 0
Пользователь №: 14.305



Удалив эти 2 строки, получается другая ошибка (IMG:style_emoticons/default/sad.gif) Но тут дело до Prompt даже не доходит:
(IMG:https://i115.fastpic.org/big/2021/0926/cb/ce74a836582d4bbe3e2ddbf93915afcb.jpg)
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
cirus
сообщение 26.9.2021, 23:27
Сообщение #17


**********

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
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
фонарик
сообщение 26.9.2021, 23:32
Сообщение #18


****

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)
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения

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

 

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