Помощь c ffi

Статус
В этой теме нельзя размещать новые ответы.

- |2347| -

Известный
Автор темы
369
124
Версия MoonLoader
.026-beta
Подскажите, как сделать отключение мониторов с помощью FFI или другой библиотеки.
 
Решение
lua:
ffi.cdef[[
    int SendMessageA(void* hWnd, uint32_t Msg, int wParam, int lParam);
    void* FindWindowA(const char* lpClassName, const char* lpWindowName);
    int PostMessageA(void* hWnd, uint32_t Msg, int wParam, int lParam);
]]

local WM_SYSCOMMAND = 0x0112
local SC_MONITORPOWER = 0xF170
local MONITOR_OFF = 2
local MONITOR_ON = -1

function turnOffMonitors()
    -- Находим окно рабочего стола напрямую
    local hwnd = ffi.C.FindWindowA("Shell_TrayWnd", nil)
    -- Отправляем команду выключения через PostMessage
    ffi.C.PostMessageA(hwnd, WM_SYSCOMMAND, SC_MONITORPOWER, MONITOR_OFF)
end

function turnOnMonitors()
    local hwnd = ffi.C.FindWindowA("Shell_TrayWnd", nil)
    ffi.C.PostMessageA(hwnd, WM_SYSCOMMAND, SC_MONITORPOWER...

zuxobu

Участник
12
5
попробуй это, может поможет

lua:
ffi.cdef[[
    int SendMessageA(void* hWnd, uint32_t Msg, int wParam, int lParam);
    void* GetDesktopWindow();
    int PostMessageA(void* hWnd, uint32_t Msg, int wParam, int lParam);
    int SystemParametersInfoA(uint32_t uiAction, uint32_t uiParam, void* pvParam, uint32_t fWinIni);
]]

local WM_SYSCOMMAND = 0x0112
local SC_MONITORPOWER = 0xF170
local MONITOR_OFF = 2
local MONITOR_ON = -1
local SPI_SETSCREENSAVEACTIVE = 0x0011
local SPIF_SENDWININICHANGE = 0x02

function turnOffMonitors()
    local hwnd = ffi.C.GetDesktopWindow()
    
    ffi.C.SystemParametersInfoA(SPI_SETSCREENSAVEACTIVE, 0, nil, 0)
    
    ffi.C.SendMessageA(hwnd, WM_SYSCOMMAND, SC_MONITORPOWER, MONITOR_OFF)
end

function turnOnMonitors()
    local hwnd = ffi.C.GetDesktopWindow()
    ffi.C.SendMessageA(hwnd, WM_SYSCOMMAND, SC_MONITORPOWER, MONITOR_ON)
    
    ffi.C.SystemParametersInfoA(SPI_SETSCREENSAVEACTIVE, 1, nil, SPIF_SENDWININICHANGE)
end
 

- |2347| -

Известный
Автор темы
369
124
попробуй это, может поможет

lua:
ffi.cdef[[
    int SendMessageA(void* hWnd, uint32_t Msg, int wParam, int lParam);
    void* GetDesktopWindow();
    int PostMessageA(void* hWnd, uint32_t Msg, int wParam, int lParam);
    int SystemParametersInfoA(uint32_t uiAction, uint32_t uiParam, void* pvParam, uint32_t fWinIni);
]]

local WM_SYSCOMMAND = 0x0112
local SC_MONITORPOWER = 0xF170
local MONITOR_OFF = 2
local MONITOR_ON = -1
local SPI_SETSCREENSAVEACTIVE = 0x0011
local SPIF_SENDWININICHANGE = 0x02

function turnOffMonitors()
    local hwnd = ffi.C.GetDesktopWindow()
   
    ffi.C.SystemParametersInfoA(SPI_SETSCREENSAVEACTIVE, 0, nil, 0)
   
    ffi.C.SendMessageA(hwnd, WM_SYSCOMMAND, SC_MONITORPOWER, MONITOR_OFF)
end

function turnOnMonitors()
    local hwnd = ffi.C.GetDesktopWindow()
    ffi.C.SendMessageA(hwnd, WM_SYSCOMMAND, SC_MONITORPOWER, MONITOR_ON)
   
    ffi.C.SystemParametersInfoA(SPI_SETSCREENSAVEACTIVE, 1, nil, SPIF_SENDWININICHANGE)
end
не работает
 

zuxobu

Участник
12
5
lua:
ffi.cdef[[
    int SendMessageA(void* hWnd, uint32_t Msg, int wParam, int lParam);
    void* FindWindowA(const char* lpClassName, const char* lpWindowName);
    int PostMessageA(void* hWnd, uint32_t Msg, int wParam, int lParam);
]]

local WM_SYSCOMMAND = 0x0112
local SC_MONITORPOWER = 0xF170
local MONITOR_OFF = 2
local MONITOR_ON = -1

function turnOffMonitors()
    -- Находим окно рабочего стола напрямую
    local hwnd = ffi.C.FindWindowA("Shell_TrayWnd", nil)
    -- Отправляем команду выключения через PostMessage
    ffi.C.PostMessageA(hwnd, WM_SYSCOMMAND, SC_MONITORPOWER, MONITOR_OFF)
end

function turnOnMonitors()
    local hwnd = ffi.C.FindWindowA("Shell_TrayWnd", nil)
    ffi.C.PostMessageA(hwnd, WM_SYSCOMMAND, SC_MONITORPOWER, MONITOR_ON)
end
если это опять не поможет, то напишешь, у меня работает
 
  • Влюблен
Реакции: - |2347| -
Статус
В этой теме нельзя размещать новые ответы.