проблема с ffi.C.MessageBoxA

Fellespe.

Участник
Автор темы
75
15
Версия MoonLoader
.026-beta
В скрипте сделал афк контроль. При достижении определенного числа афк скрипт кидает окошко винды про превышение нормы.
Но есть проблема, если не скрыть окошко, нажав OK, скрипт просто не будет продолжать работать. Например: норма стоит на 45 секунд, на 15 секунде кидает предупреждение, а на 45 должен закрыть игру, но если на первое предупреждение не реагировать, просто не будет идти подсчет дальше и второе окошко не откроется, соответственно игра не закроется. Как исправить?
Lua:
function ShowMessage(text, title, style)
    ffi.cdef [[
        int MessageBoxA(
            void* hWnd,
            const char* lpText,
            const char* lpCaption,
            unsigned int uType
        );
    ]]
    local hwnd = ffi.cast('void*', readMemory(0x00C8CF88, 4, false))
    ffi.C.MessageBoxA(hwnd, text,  title, style and (style + 0x50000) or 0x50000)
end

while true do
    if ini.cafk.status and (isPauseMenuActive() or isGamePaused()) then
        afktime = afktime + 1
        if afktime == ini.cafk.afktime - 30 then
            if ini.cafk.leavegame then
                ShowMessage(('Значение АФК уже достигло %s секунд!\nЧерез 30 секунд игра будет закрыта!'):format(afktime), 'AFK Control', 0x30)
            else
                ShowMessage(('Значение АФК уже достигло %s секунд!'):format(afktime), 'AFK Control', 0x30)
            end
        elseif afktime > ini.cafk.afktime then
            if ini.cafk.leavegame then
                ShowMessage(('Значение АФК уже достигло %s секунд!\nЗакрываю игру..'):format(afktime), 'AFK Control', 0x30)
                os.exit()
            else
                if not wasLimitAfk then
                    ShowMessage(('Вы превысили допустимое значение АФК!\nЗначение АФК уже достигло %s секунд.'):format(afktime), 'AFK Control', 0x30)
                    wasLimitAfk = true
                end
            end
        end
    end
    wait(1000)
end
 

Вложения

  • 1709134908780.png
    1709134908780.png
    7.3 KB · Просмотры: 39
Последнее редактирование:
Решение
Исправил данным методом:
Lua:
function ShowMessage(text, title, style)
    local messageboxathread = effil.thread(function(text, title, style)
      local ffi = require('ffi')
      ffi.cdef("int MessageBoxA( void* hWnd, const char* lpText, const char* lpCaption, unsigned int uType); ")
      ffi.C.MessageBoxA(nil, text, title, style and (style + 327680) or 327680)
    end)(text, title, style)

    lua_thread.create(function()
      while true do
        wait(0)
        local status, err = messageboxathread:status()

        if not err and status == "completed" then
          return
        end
      end
    end)
  end

wojciech?

Известный
Проверенный
352
236
Но есть проблема, если не скрыть окошко, нажав OK, скрипт просто не будет продолжать работать
MessageBoxA замораживает все действия, пока не будет получен результат от этого окна
 

Fellespe.

Участник
Автор темы
75
15
Исправил данным методом:
Lua:
function ShowMessage(text, title, style)
    local messageboxathread = effil.thread(function(text, title, style)
      local ffi = require('ffi')
      ffi.cdef("int MessageBoxA( void* hWnd, const char* lpText, const char* lpCaption, unsigned int uType); ")
      ffi.C.MessageBoxA(nil, text, title, style and (style + 327680) or 327680)
    end)(text, title, style)

    lua_thread.create(function()
      while true do
        wait(0)
        local status, err = messageboxathread:status()

        if not err and status == "completed" then
          return
        end
      end
    end)
  end
 
Последнее редактирование: