|
|
|
Лупа, Готовый скрипт |
|
|
cirus |
3.4.2020, 14:56
|
Elder
Сообщений: 3.480
Регистрация: 18.8.2014 Группа: Пользователи Наличность: 26708
Пользователь №: 16.971
Возраст: 29
|
Пилот 2.41. Запускать от админа. Возможно мерцание, т. к. изображение выводится на экран, а не на окно. Лупа
Код --lua local ffi = require("ffi") local user = ffi.load('User32.dll') local gdi = ffi.load('Gdi32.dll') ffi.cdef[[ struct HDC__ { int unused; }; typedef struct HDC__ *HDC; struct HWND__ { int unused; }; typedef struct HWND__ *HWND; struct HBRUSH__ { int unused; }; typedef struct HBRUSH__ *HBRUSH; struct HBITMAP__ { int unused; }; typedef struct HBITMAP__ *HBITMAP; struct HPEN__ { int unused; }; typedef struct HPEN__ *HPEN; typedef struct tagRECT{ long left; long top; long right; long bottom;}RECT; typedef struct tagPOINT {long x; long y;} POINT, *PPOINT, *NPPOINT, *LPPOINT; typedef struct tagLOGBRUSH {unsigned long lbStyle;unsigned long lbColor; unsigned long lbHatch;} LOGBRUSH, *PLOGBRUSH, *NPLOGBRUSH, *LPLOGBRUSH; typedef void *HGDIOBJ; typedef void *PVOID; short GetAsyncKeyState(int vKey); HDC GetDC(HWND hWnd); HDC CreateCompatibleDC(HDC hdc); HBITMAP CreateCompatibleBitmap(HDC hdc, int cx, int cy); HGDIOBJ SelectObject(HDC hdc, HGDIOBJ h); HPEN CreatePen(int iStyle, int cWidth, unsigned long color); HPEN ExtCreatePen(unsigned long iPenStyle, unsigned long cWidth, const LOGBRUSH *plbrush, unsigned long cStyle, const unsigned long *pstyle); HBRUSH CreateSolidBrush(unsigned long color); bool StretchBlt(HDC hdcDest, int xDest, int yDest, int wDest, int hDest, HDC hdcSrc, int xSrc, int ySrc, int wSrc, int hSrc, unsigned long rop); bool BitBlt(HDC hdc, int x, int y, int cx, int cy, HDC hdcSrc, int x1, int y1, unsigned long rop); bool DeleteObject(HGDIOBJ ho); bool LineTo(HDC hdc, int x, int y); bool MoveToEx(HDC hdc, int x, int y, LPPOINT lppt); bool SystemParametersInfoA(unsigned int uiAction, unsigned int uiParam, PVOID pvParam, unsigned int fWinIni); int FillRect(HDC hDC, const RECT *lprc, HBRUSH hbr); ]] local SRCCOPY = 13369376 local PS_USERSTYLE = 7 local PS_SOLID = 0 local BS_SOLID = 0 local COLOR_BLACK = 0 local COLOR_WHITE = 16777215
local LOGBRUSH = ffi.new('LOGBRUSH', {BS_SOLID, COLOR_WHITE, 0}) local pstyle = ffi.new('int[2]', {1, 1}) local hdc = user.GetDC(ffi.cast('HWND', 0)) local Comp = gdi.CreateCompatibleDC(hdc) local Comp2 = gdi.CreateCompatibleDC(hdc) local bitmap = gdi.CreateCompatibleBitmap(hdc, 200, 200) local bitmap2 = gdi.CreateCompatibleBitmap(hdc, 200, 200) gdi.SelectObject(Comp, bitmap) gdi.SelectObject(Comp2, bitmap2) local Brush = gdi.CreateSolidBrush(COLOR_WHITE) local Pen_black = gdi.CreatePen(PS_SOLID, 1, COLOR_BLACK) local Pen = gdi.ExtCreatePen(PS_USERSTYLE, 1, LOGBRUSH, 2, pstyle) local rect = ffi.new('RECT', {0, 0, 200, 200}) local mouse_speed, zoom
function lupa() local mouseX, mouseY = mouse_pos ('abs') user.FillRect(Comp, rect, Brush) local pos = math.floor(100 / zoom) local wSrc = math.floor(200 / zoom) local hSrc = math.floor(200 / zoom)
gdi.StretchBlt(Comp, 0, 0, wSrc * zoom, hSrc * zoom, hdc, mouseX - pos, mouseY - pos, wSrc, hSrc, SRCCOPY) gdi.BitBlt(Comp2, 0, 0, 200, 200, Comp, 0, 0, SRCCOPY)
local delta = math.floor(pos * zoom + zoom / 2) local oldPen = gdi.SelectObject(Comp2, Pen_black) gdi.MoveToEx(Comp2, 0, delta, ffi.cast('LPPOINT', 0)) gdi.LineTo(Comp2, 200, delta) gdi.MoveToEx(Comp2, delta, 0, ffi.cast('LPPOINT', 0)) gdi.LineTo(Comp2,delta, 200) gdi.SelectObject(Comp2, oldPen) oldPen = gdi.SelectObject(Comp2, Pen) gdi.MoveToEx(Comp2, 0, delta, ffi.cast('LPPOINT', 0)) gdi.LineTo(Comp2, 200, delta) gdi.MoveToEx(Comp2, delta, 0, ffi.cast('LPPOINT', 0)) gdi.LineTo(Comp2, delta, 200) gdi.SelectObject(Comp2, oldPen) gdi.BitBlt(hdc, 0, 0, 200, 200, Comp2, 0, 0, SRCCOPY) end
function zoom_control() if user.GetAsyncKeyState(90) ~= 0 then -- если нажата клавиша Z while user.GetAsyncKeyState(90) ~= 0 do wait(1) end if zoom > 1 then zoom = zoom - 1 end end if user.GetAsyncKeyState(88) ~= 0 then -- если нажата клавиша X while user.GetAsyncKeyState(88) ~= 0 do wait(1) end if zoom < 20 then zoom = zoom + 1 end end end
function SETMOUSESPEED(speed) local SPI_SETMOUSESPEED = 113 local mouse_speed = ffi.new('int[1]', speed) user.SystemParametersInfoA(SPI_SETMOUSESPEED, 0, ffi.cast('PVOID', mouse_speed[0]), 0) end function GETMOUSESPEED() local SPI_GETMOUSESPEED = 112 local mouse_speed = ffi.new('int[1]') user.SystemParametersInfoA(SPI_GETMOUSESPEED, 0, mouse_speed, 0) return mouse_speed[0] end
function mouse_control() if user.GetAsyncKeyState(67) ~= 0 then -- если нажата клавиша C while user.GetAsyncKeyState(67) ~= 0 do wait(1) end if GETMOUSESPEED() > 1 then mouse_speed = mouse_speed - 1 SETMOUSESPEED(mouse_speed) end end if user.GetAsyncKeyState(86) ~= 0 then -- если нажата клавиша V while user.GetAsyncKeyState(86) ~= 0 do wait(1) end if GETMOUSESPEED() < 20 then mouse_speed = mouse_speed + 1 SETMOUSESPEED(mouse_speed) end end end
function hint_() local s = 'Изменение масштаба клавиши Z и X' .. '\r\n' .. 'Скорость курсора клавиши C и V' .. '\r\n' hint (s .. 'Увеличение: x' .. zoom .. '\r\n' .. 'Скорость курсора: ' .. mouse_speed) end
mouse_speed = GETMOUSESPEED()
zoom = 10 -- во сколько раз увеличить, начальное значение от 1 до 20 while true do lupa() -- вывод изображения zoom_control() -- изменение масштаба вывода mouse_control() -- изменение скорости курсора hint_() -- вывод подсказки wait(1) end
|
|
|
|
cirus |
27.9.2020, 20:16
|
Elder
Сообщений: 3.480
Регистрация: 18.8.2014 Группа: Пользователи Наличность: 26708
Пользователь №: 16.971
Возраст: 29
|
|
|
|
|
cirus |
30.3.2022, 12:14
|
Elder
Сообщений: 3.480
Регистрация: 18.8.2014 Группа: Пользователи Наличность: 26708
Пользователь №: 16.971
Возраст: 29
|
Лупа, вывод в окно
Код --lua local ffi = require("ffi") local user = ffi.load('User32.dll') local gdi = ffi.load('Gdi32.dll')
local WM_CREATE = 0x0001 local WM_CLOSE = 0x0010 local WS_CHILD = 0x40000000 local WS_BORDER = 0x00800000 local WM_COMMAND = 0x0111 local WS_CAPTION = 0x00C00000 local WS_SYSMENU = 0x00080000 local WS_EX_DLGMODALFRAME = 0x00000001 local WS_EX_TOPMOST = 0x00000008 local COLOR_WINDOW = 5 local IDC_ARROW = 32512 local WS_VISIBLE = 0x10000000
local SRCCOPY = 13369376 local PS_USERSTYLE = 7 local PS_SOLID = 0 local BS_SOLID = 0 local COLOR_BLACK = 0 local COLOR_WHITE = 16777215
ffi.cdef[[ struct HDC__ { int unused; }; typedef struct HDC__ *HDC; struct HWND__ { int unused; }; typedef struct HWND__ *HWND; struct HBRUSH__ { int unused; }; typedef struct HBRUSH__ *HBRUSH; struct HBITMAP__ { int unused; }; typedef struct HBITMAP__ *HBITMAP; struct HPEN__ { int unused; }; typedef struct HPEN__ *HPEN; struct HICON__ { int unused; }; typedef struct HICON__ *HICON; struct HMENU__ { int unused; }; typedef struct HMENU__ *HMENU; struct HINSTANCE__ { int unused; }; typedef struct HINSTANCE__ *HINSTANCE;
typedef struct { long left; long top; long right; long bottom;}RECT; typedef struct {long x; long y;} POINT, *PPOINT, *NPPOINT, *LPPOINT; typedef struct {unsigned long lbStyle;unsigned long lbColor; unsigned long lbHatch;} LOGBRUSH, *PLOGBRUSH, *NPLOGBRUSH, *LPLOGBRUSH;
typedef HICON HCURSOR; typedef void *HGDIOBJ; typedef void *PVOID; typedef unsigned int UINT; typedef long LONG; typedef unsigned int UINT_PTR, *PUINT_PTR; typedef long LONG_PTR, *PLONG_PTR; typedef UINT_PTR WPARAM; typedef LONG_PTR LPARAM; typedef unsigned long DWORD; typedef unsigned short WORD; typedef WORD ATOM; typedef int BOOL; typedef void VOID; typedef VOID *LPVOID; typedef LONG_PTR LRESULT;
typedef LONG (__stdcall* WNDPROC)(HWND, UINT, WPARAM, LONG);
typedef const char *LPCSTR, *PCSTR;
typedef struct { UINT style; WNDPROC lpfnWndProc; int cbClsExtra; int cbWndExtra; HINSTANCE hInstance; HICON hIcon; HCURSOR hCursor; HBRUSH hbrBackground; LPCSTR lpszMenuName; LPCSTR lpszClassName; } WNDCLASSA, *PWNDCLASSA, *NPWNDCLASSA, *LPWNDCLASSA;
typedef struct { HWND hwnd; UINT message; WPARAM wParam; LPARAM lParam; DWORD time; POINT pt; DWORD lPrivate; } MSG, *PMSG, *NPMSG, *LPMSG;
typedef struct { DWORD cbSize; RECT rcWindow; RECT rcClient; DWORD dwStyle; DWORD dwExStyle; DWORD dwWindowStatus; UINT cxWindowBorders; UINT cyWindowBorders; ATOM atomWindowType; WORD wCreatorVersion; } WINDOWINFO, *PWINDOWINFO, *LPWINDOWINFO;
HCURSOR LoadCursorA( HINSTANCE hInstance, LPCSTR lpCursorName );
ATOM RegisterClassA( const WNDCLASSA *lpWndClass );
BOOL UnregisterClassA( LPCSTR lpClassName, HINSTANCE hInstance );
HWND CreateWindowExA( DWORD dwExStyle, LPCSTR lpClassName, LPCSTR lpWindowName, DWORD dwStyle, int X, int Y, int nWidth, int nHeight, HWND hWndParent, HMENU hMenu, HINSTANCE hInstance, LPVOID lpParam );
BOOL DestroyWindow( HWND hWnd );
LRESULT DefWindowProcA( HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam);
BOOL PeekMessageA( LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT wMsgFilterMax, UINT wRemoveMsg );
BOOL GetMessageA( LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT wMsgFilterMax );
BOOL TranslateMessage( const MSG *lpMsg );
LRESULT DispatchMessageA( const MSG *lpMsg );
void PostQuitMessage( int nExitCode );
LRESULT SendMessageA( HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam );
BOOL GetCursorPos( LPPOINT lpPoint );
typedef void (* TIMERPROC)(int, UINT, UINT, UINT); int SetTimer(HWND hWnd, UINT nIDEvent, UINT uElapse, TIMERPROC lpTimerFunc); bool KillTimer(HWND hWnd, UINT uIDEvent);
short GetAsyncKeyState(int vKey); HDC GetDC(HWND hWnd); HDC CreateCompatibleDC(HDC hdc); HBITMAP CreateCompatibleBitmap(HDC hdc, int cx, int cy); HGDIOBJ SelectObject(HDC hdc, HGDIOBJ h); HPEN CreatePen(int iStyle, int cWidth, unsigned long color); HPEN ExtCreatePen(unsigned long iPenStyle, unsigned long cWidth, const LOGBRUSH *plbrush, unsigned long cStyle, const unsigned long *pstyle); HBRUSH CreateSolidBrush(unsigned long color); bool StretchBlt(HDC hdcDest, int xDest, int yDest, int wDest, int hDest, HDC hdcSrc, int xSrc, int ySrc, int wSrc, int hSrc, unsigned long rop); bool BitBlt(HDC hdc, int x, int y, int cx, int cy, HDC hdcSrc, int x1, int y1, unsigned long rop); bool DeleteObject(HGDIOBJ ho); bool LineTo(HDC hdc, int x, int y); bool MoveToEx(HDC hdc, int x, int y, LPPOINT lppt); bool SystemParametersInfoA(unsigned int uiAction, unsigned int uiParam, PVOID pvParam, unsigned int fWinIni); int FillRect(HDC hDC, const RECT *lprc, HBRUSH hbr); ]]
-- позиция окна local windowposX = 0 local windowposY = 0
-- хендл окна local main_window
local LOGBRUSH = ffi.new('LOGBRUSH', {BS_SOLID, COLOR_WHITE, 0}) local pstyle = ffi.new('int[2]', {1, 1}) local hdc local hdc2 = user.GetDC(ffi.cast('HWND', 0)) local Comp = gdi.CreateCompatibleDC(hdc2) local Comp2 = gdi.CreateCompatibleDC(hdc2) local bitmap = gdi.CreateCompatibleBitmap(hdc2, 200, 200) local bitmap2 = gdi.CreateCompatibleBitmap(hdc2, 200, 200) gdi.SelectObject(Comp, bitmap) gdi.SelectObject(Comp2, bitmap2) local Brush = gdi.CreateSolidBrush(COLOR_WHITE) local Pen_black = gdi.CreatePen(PS_SOLID, 1, COLOR_BLACK) local Pen = gdi.ExtCreatePen(PS_USERSTYLE, 1, LOGBRUSH, 2, pstyle) local rect = ffi.new('RECT', {0, 0, 200, 200}) local mouse_speed, mouse_speed_begin local zoom = 10
function zoom_control() if user.GetAsyncKeyState(90) ~= 0 then -- если нажата клавиша Z while user.GetAsyncKeyState(90) ~= 0 do wait(1) end if zoom > 1 then zoom = zoom - 1 end end if user.GetAsyncKeyState(88) ~= 0 then -- если нажата клавиша X while user.GetAsyncKeyState(88) ~= 0 do wait(1) end if zoom < 20 then zoom = zoom + 1 end end end
function SETMOUSESPEED(speed) local SPI_SETMOUSESPEED = 113 local mouse_speed = ffi.new('int[1]', speed) user.SystemParametersInfoA(SPI_SETMOUSESPEED, 0, ffi.cast('PVOID', mouse_speed[0]), 0) end function GETMOUSESPEED() local SPI_GETMOUSESPEED = 112 local mouse_speed = ffi.new('int[1]') user.SystemParametersInfoA(SPI_GETMOUSESPEED, 0, mouse_speed, 0) return mouse_speed[0] end
function mouse_control() if user.GetAsyncKeyState(67) ~= 0 then -- если нажата клавиша C while user.GetAsyncKeyState(67) ~= 0 do wait(1) end if GETMOUSESPEED() > 1 then mouse_speed = mouse_speed - 1 SETMOUSESPEED(mouse_speed) end end if user.GetAsyncKeyState(86) ~= 0 then -- если нажата клавиша V while user.GetAsyncKeyState(86) ~= 0 do wait(1) end if GETMOUSESPEED() < 20 then mouse_speed = mouse_speed + 1 SETMOUSESPEED(mouse_speed) end end end
function lupa() zoom_control() -- изменение масштаба вывода mouse_control() -- изменение скорости курсора
local mousePos = ffi.new('POINT') user.GetCursorPos (mousePos) local mouseX, mouseY = mousePos.x, mousePos.y
user.FillRect(Comp, rect, Brush) local pos = math.floor(100 / zoom) local wSrc = math.floor(200 / zoom) local hSrc = math.floor(200 / zoom)
gdi.StretchBlt(Comp, 0, 0, wSrc * zoom, hSrc * zoom, hdc2, mouseX - pos, mouseY - pos, wSrc, hSrc, SRCCOPY) gdi.BitBlt(Comp2, 0, 0, 200, 200, Comp, 0, 0, SRCCOPY)
local delta = math.floor(pos * zoom + zoom / 2) local oldPen = gdi.SelectObject(Comp2, Pen_black) gdi.MoveToEx(Comp2, 0, delta, ffi.cast('LPPOINT', 0)) gdi.LineTo(Comp2, 200, delta) gdi.MoveToEx(Comp2, delta, 0, ffi.cast('LPPOINT', 0)) gdi.LineTo(Comp2,delta, 200) gdi.SelectObject(Comp2, oldPen) oldPen = gdi.SelectObject(Comp2, Pen) gdi.MoveToEx(Comp2, 0, delta, ffi.cast('LPPOINT', 0)) gdi.LineTo(Comp2, 200, delta) gdi.MoveToEx(Comp2, delta, 0, ffi.cast('LPPOINT', 0)) gdi.LineTo(Comp2, delta, 200) gdi.SelectObject(Comp2, oldPen) gdi.BitBlt(hdc, 0, 0, 200, 200, Comp2, 0, 0, SRCCOPY) end
local function WindowProc(hWnd, message, wParam, lParam) if message == WM_CLOSE then SETMOUSESPEED(mouse_speed_begin) user.KillTimer(main_window, 1111) ffi.C.PostQuitMessage(0) end
return ffi.C.DefWindowProcA(hWnd, message, wParam, lParam) end
local lua_window = function (...) local window_class = 'MywindowClass' local wcWindowClass = ffi.new('WNDCLASSA', 0) wcWindowClass.lpfnWndProc = WindowProc wcWindowClass.lpszClassName = window_class wcWindowClass.hCursor = ffi.C.LoadCursorA(ffi.cast('HINSTANCE', NULL), ffi.cast('LPCSTR', IDC_ARROW)) wcWindowClass.hbrBackground = ffi.cast('HBRUSH', COLOR_WINDOW) ffi.C.RegisterClassA(wcWindowClass) main_window = ffi.C.CreateWindowExA(WS_EX_TOPMOST + WS_EX_DLGMODALFRAME, window_class, 'Лупа', WS_CAPTION + WS_SYSMENU + WS_VISIBLE, windowposX, windowposY, 210, 230, ffi.cast('HWND', 0), ffi.cast('HMENU', 0), ffi.cast('HINSTANCE', 0), ffi.cast('LPVOID', 0))
hdc = user.GetDC(ffi.cast('HWND', main_window)) ffi.C.SetTimer(main_window, 1111, 10, lupa)
local message = ffi.new('MSG') repeat lupa() local bRet = ffi.C.GetMessageA(message, NULL, 0, 0) if bRet == -1 then break end ffi.C.TranslateMessage(message) ffi.C.DispatchMessageA(message) until bRet == 0
ffi.C.DestroyWindow(main_window) ffi.C.UnregisterClassA(window_class, ffi.cast('HINSTANCE', 0)) end
mouse_speed_begin = GETMOUSESPEED() mouse_speed = mouse_speed_begin lua_window() Изменение масштаба клавиши Z и X. Скорость курсора клавиши C и V. При закрытии окна скорость курсора будет восстановлена.
|
|
|
|
cirus |
30.3.2022, 14:53
|
Elder
Сообщений: 3.480
Регистрация: 18.8.2014 Группа: Пользователи Наличность: 26708
Пользователь №: 16.971
Возраст: 29
|
Добавил хоткей для закрытия окна. Ctrl + Shift + Z. Код user.RegisterHotKey(main_window, 1111, MOD_CONTROL + MOD_SHIFT, 90); -- Ctrl + Shift + Z Лупа
Код --lua local ffi = require("ffi") local user = ffi.load('User32.dll') local gdi = ffi.load('Gdi32.dll')
local WM_CREATE = 0x0001 local WM_CLOSE = 0x0010 local WS_CHILD = 0x40000000 local WS_BORDER = 0x00800000 local WM_COMMAND = 0x0111 local WS_CAPTION = 0x00C00000 local WS_SYSMENU = 0x00080000 local WS_EX_DLGMODALFRAME = 0x00000001 local WS_EX_TOPMOST = 0x00000008 local COLOR_WINDOW = 5 local IDC_ARROW = 32512 local WS_VISIBLE = 0x10000000 local WS_POPUP = 0x80000000 local SRCCOPY = 13369376 local PS_USERSTYLE = 7 local PS_SOLID = 0 local BS_SOLID = 0 local COLOR_BLACK = 0 local COLOR_WHITE = 16777215 local WM_HOTKEY = 0x0312 local MOD_SHIFT = 0x0004 local MOD_CONTROL = 0x0002
ffi.cdef[[ struct HDC__ { int unused; }; typedef struct HDC__ *HDC; struct HWND__ { int unused; }; typedef struct HWND__ *HWND; struct HBRUSH__ { int unused; }; typedef struct HBRUSH__ *HBRUSH; struct HBITMAP__ { int unused; }; typedef struct HBITMAP__ *HBITMAP; struct HPEN__ { int unused; }; typedef struct HPEN__ *HPEN; struct HICON__ { int unused; }; typedef struct HICON__ *HICON; struct HMENU__ { int unused; }; typedef struct HMENU__ *HMENU; struct HINSTANCE__ { int unused; }; typedef struct HINSTANCE__ *HINSTANCE;
typedef struct { long left; long top; long right; long bottom;}RECT; typedef struct {long x; long y;} POINT, *PPOINT, *NPPOINT, *LPPOINT; typedef struct {unsigned long lbStyle;unsigned long lbColor; unsigned long lbHatch;} LOGBRUSH, *PLOGBRUSH, *NPLOGBRUSH, *LPLOGBRUSH;
typedef HICON HCURSOR; typedef void *HGDIOBJ; typedef void *PVOID; typedef unsigned int UINT; typedef long LONG; typedef unsigned int UINT_PTR, *PUINT_PTR; typedef long LONG_PTR, *PLONG_PTR; typedef UINT_PTR WPARAM; typedef LONG_PTR LPARAM; typedef unsigned long DWORD; typedef unsigned short WORD; typedef WORD ATOM; typedef int BOOL; typedef void VOID; typedef VOID *LPVOID; typedef LONG_PTR LRESULT;
typedef LONG (__stdcall* WNDPROC)(HWND, UINT, WPARAM, LONG);
typedef const char *LPCSTR, *PCSTR;
typedef struct { UINT style; WNDPROC lpfnWndProc; int cbClsExtra; int cbWndExtra; HINSTANCE hInstance; HICON hIcon; HCURSOR hCursor; HBRUSH hbrBackground; LPCSTR lpszMenuName; LPCSTR lpszClassName; } WNDCLASSA, *PWNDCLASSA, *NPWNDCLASSA, *LPWNDCLASSA;
typedef struct { HWND hwnd; UINT message; WPARAM wParam; LPARAM lParam; DWORD time; POINT pt; DWORD lPrivate; } MSG, *PMSG, *NPMSG, *LPMSG;
typedef struct { DWORD cbSize; RECT rcWindow; RECT rcClient; DWORD dwStyle; DWORD dwExStyle; DWORD dwWindowStatus; UINT cxWindowBorders; UINT cyWindowBorders; ATOM atomWindowType; WORD wCreatorVersion; } WINDOWINFO, *PWINDOWINFO, *LPWINDOWINFO;
HCURSOR LoadCursorA( HINSTANCE hInstance, LPCSTR lpCursorName );
ATOM RegisterClassA( const WNDCLASSA *lpWndClass );
BOOL UnregisterClassA( LPCSTR lpClassName, HINSTANCE hInstance );
HWND CreateWindowExA( DWORD dwExStyle, LPCSTR lpClassName, LPCSTR lpWindowName, DWORD dwStyle, int X, int Y, int nWidth, int nHeight, HWND hWndParent, HMENU hMenu, HINSTANCE hInstance, LPVOID lpParam );
BOOL DestroyWindow( HWND hWnd );
LRESULT DefWindowProcA( HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam);
BOOL PeekMessageA( LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT wMsgFilterMax, UINT wRemoveMsg );
BOOL GetMessageA( LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT wMsgFilterMax );
BOOL TranslateMessage( const MSG *lpMsg );
LRESULT DispatchMessageA( const MSG *lpMsg );
void PostQuitMessage( int nExitCode );
LRESULT SendMessageA( HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam );
BOOL GetCursorPos( LPPOINT lpPoint );
BOOL RegisterHotKey( HWND hWnd, int id, UINT fsModifiers, UINT vk );
BOOL UnregisterHotKey( HWND hWnd, int id );
typedef void (* TIMERPROC)(int, UINT, UINT, UINT); int SetTimer(HWND hWnd, UINT nIDEvent, UINT uElapse, TIMERPROC lpTimerFunc); bool KillTimer(HWND hWnd, UINT uIDEvent);
short GetAsyncKeyState(int vKey); HDC GetDC(HWND hWnd); HDC CreateCompatibleDC(HDC hdc); HBITMAP CreateCompatibleBitmap(HDC hdc, int cx, int cy); HGDIOBJ SelectObject(HDC hdc, HGDIOBJ h); HPEN CreatePen(int iStyle, int cWidth, unsigned long color); HPEN ExtCreatePen(unsigned long iPenStyle, unsigned long cWidth, const LOGBRUSH *plbrush, unsigned long cStyle, const unsigned long *pstyle); HBRUSH CreateSolidBrush(unsigned long color); bool StretchBlt(HDC hdcDest, int xDest, int yDest, int wDest, int hDest, HDC hdcSrc, int xSrc, int ySrc, int wSrc, int hSrc, unsigned long rop); bool BitBlt(HDC hdc, int x, int y, int cx, int cy, HDC hdcSrc, int x1, int y1, unsigned long rop); bool DeleteObject(HGDIOBJ ho); bool LineTo(HDC hdc, int x, int y); bool MoveToEx(HDC hdc, int x, int y, LPPOINT lppt); bool SystemParametersInfoA(unsigned int uiAction, unsigned int uiParam, PVOID pvParam, unsigned int fWinIni); int FillRect(HDC hDC, const RECT *lprc, HBRUSH hbr); ]]
-- позиция окна local windowposX = 0 local windowposY = 0
-- хендл окна local main_window
local LOGBRUSH = ffi.new('LOGBRUSH', {BS_SOLID, COLOR_WHITE, 0}) local pstyle = ffi.new('int[2]', {1, 1}) local hdc local hdc2 = user.GetDC(ffi.cast('HWND', 0)) local Comp = gdi.CreateCompatibleDC(hdc2) local Comp2 = gdi.CreateCompatibleDC(hdc2) local bitmap = gdi.CreateCompatibleBitmap(hdc2, 200, 200) local bitmap2 = gdi.CreateCompatibleBitmap(hdc2, 200, 200) gdi.SelectObject(Comp, bitmap) gdi.SelectObject(Comp2, bitmap2) local Brush = gdi.CreateSolidBrush(COLOR_WHITE) local Pen_black = gdi.CreatePen(PS_SOLID, 1, COLOR_BLACK) local Pen = gdi.ExtCreatePen(PS_USERSTYLE, 1, LOGBRUSH, 2, pstyle) local rect = ffi.new('RECT', {0, 0, 200, 200}) local mouse_speed, mouse_speed_begin local zoom = 10
function zoom_control() if user.GetAsyncKeyState(90) ~= 0 then -- если нажата клавиша Z while user.GetAsyncKeyState(90) ~= 0 do wait(1) end if zoom > 1 then zoom = zoom - 1 end end if user.GetAsyncKeyState(88) ~= 0 then -- если нажата клавиша X while user.GetAsyncKeyState(88) ~= 0 do wait(1) end if zoom < 20 then zoom = zoom + 1 end end end
function SETMOUSESPEED(speed) local SPI_SETMOUSESPEED = 113 local mouse_speed = ffi.new('int[1]', speed) user.SystemParametersInfoA(SPI_SETMOUSESPEED, 0, ffi.cast('PVOID', mouse_speed[0]), 0) end function GETMOUSESPEED() local SPI_GETMOUSESPEED = 112 local mouse_speed = ffi.new('int[1]') user.SystemParametersInfoA(SPI_GETMOUSESPEED, 0, mouse_speed, 0) return mouse_speed[0] end
function mouse_control() if user.GetAsyncKeyState(67) ~= 0 then -- если нажата клавиша C while user.GetAsyncKeyState(67) ~= 0 do wait(1) end if GETMOUSESPEED() > 1 then mouse_speed = mouse_speed - 1 SETMOUSESPEED(mouse_speed) end end if user.GetAsyncKeyState(86) ~= 0 then -- если нажата клавиша V while user.GetAsyncKeyState(86) ~= 0 do wait(1) end if GETMOUSESPEED() < 20 then mouse_speed = mouse_speed + 1 SETMOUSESPEED(mouse_speed) end end end
function lupa() zoom_control() -- изменение масштаба вывода mouse_control() -- изменение скорости курсора
local mousePos = ffi.new('POINT') user.GetCursorPos (mousePos) local mouseX, mouseY = mousePos.x, mousePos.y
user.FillRect(Comp, rect, Brush) local pos = math.floor(100 / zoom) local wSrc = math.floor(200 / zoom) local hSrc = math.floor(200 / zoom)
gdi.StretchBlt(Comp, 0, 0, wSrc * zoom, hSrc * zoom, hdc2, mouseX - pos, mouseY - pos, wSrc, hSrc, SRCCOPY) gdi.BitBlt(Comp2, 0, 0, 200, 200, Comp, 0, 0, SRCCOPY)
local delta = math.floor(pos * zoom + zoom / 2) local oldPen = gdi.SelectObject(Comp2, Pen_black) gdi.MoveToEx(Comp2, 0, delta, ffi.cast('LPPOINT', 0)) gdi.LineTo(Comp2, 200, delta) gdi.MoveToEx(Comp2, delta, 0, ffi.cast('LPPOINT', 0)) gdi.LineTo(Comp2,delta, 200) gdi.SelectObject(Comp2, oldPen) oldPen = gdi.SelectObject(Comp2, Pen) gdi.MoveToEx(Comp2, 0, delta, ffi.cast('LPPOINT', 0)) gdi.LineTo(Comp2, 200, delta) gdi.MoveToEx(Comp2, delta, 0, ffi.cast('LPPOINT', 0)) gdi.LineTo(Comp2, delta, 200) gdi.SelectObject(Comp2, oldPen) gdi.BitBlt(hdc, 0, 0, 200, 200, Comp2, 0, 0, SRCCOPY) end
local function WindowProc(hWnd, message, wParam, lParam) if message == WM_HOTKEY then user.UnregisterHotKey(main_window, 1111) user.SendMessageA(main_window, WM_CLOSE, 0, 0) end
if message == WM_CLOSE or message == WM_HOTKEY then SETMOUSESPEED(mouse_speed_begin)
user.KillTimer(main_window, 1111) ffi.C.PostQuitMessage(0) end
return ffi.C.DefWindowProcA(hWnd, message, wParam, lParam) end
local lua_window = function (...) local window_class = 'MywindowClass' local wcWindowClass = ffi.new('WNDCLASSA', 0) wcWindowClass.lpfnWndProc = WindowProc wcWindowClass.lpszClassName = window_class wcWindowClass.hCursor = ffi.C.LoadCursorA(ffi.cast('HINSTANCE', NULL), ffi.cast('LPCSTR', IDC_ARROW)) wcWindowClass.hbrBackground = ffi.cast('HBRUSH', COLOR_WINDOW) ffi.C.RegisterClassA(wcWindowClass) main_window = ffi.C.CreateWindowExA(WS_EX_TOPMOST, window_class, '', WS_VISIBLE + WS_POPUP, windowposX, windowposY, 200, 200, ffi.cast('HWND', 0), ffi.cast('HMENU', 0), ffi.cast('HINSTANCE', 0), ffi.cast('LPVOID', 0))
hdc = user.GetDC(ffi.cast('HWND', main_window)) ffi.C.SetTimer(main_window, 1111, 10, lupa) user.RegisterHotKey(main_window, 1111, MOD_CONTROL + MOD_SHIFT, 90); -- Ctrl + Shift + Z
local message = ffi.new('MSG') repeat lupa() local bRet = ffi.C.GetMessageA(message, NULL, 0, 0) if bRet == -1 then break end ffi.C.TranslateMessage(message) ffi.C.DispatchMessageA(message) until bRet == 0
ffi.C.DestroyWindow(main_window) ffi.C.UnregisterClassA(window_class, ffi.cast('HINSTANCE', 0)) end
mouse_speed_begin = GETMOUSESPEED() mouse_speed = mouse_speed_begin lua_window()
|
|
|
|
DarkMaster |
30.3.2022, 17:33
|
Модератор UOPilot
Сообщений: 9.467
Регистрация: 2.12.2008 Группа: Супермодераторы Наличность: 27723
Пользователь №: 11.279
|
Размер окна вынесен в шапку скрипта, туда же возможность включить следование за мышью. Огромное тебе спасибо =) Каст сделал вот так: wnd.zoom = tonumber(ffi.cast('int', main_window)) вроде кошерно лупа рядом с мышью
Код --lua local window_size = 300 -- размер лупы local follow_enable = true -- следовать за мышью true / false
local wnd = {}
local ffi = require("ffi") local user = ffi.load('User32.dll') local gdi = ffi.load('Gdi32.dll')
local WM_CREATE = 0x0001 local WM_CLOSE = 0x0010 local WS_CHILD = 0x40000000 local WS_BORDER = 0x00800000 local WM_COMMAND = 0x0111 local WS_CAPTION = 0x00C00000 local WS_SYSMENU = 0x00080000 local WS_EX_DLGMODALFRAME = 0x00000001 local WS_EX_TOPMOST = 0x00000008 local COLOR_WINDOW = 5 local IDC_ARROW = 32512 local WS_VISIBLE = 0x10000000 local WS_POPUP = 0x80000000 local SRCCOPY = 13369376 local PS_USERSTYLE = 7 local PS_SOLID = 0 local BS_SOLID = 0 local COLOR_BLACK = 0 local COLOR_WHITE = 16777215 local WM_HOTKEY = 0x0312 local MOD_SHIFT = 0x0004 local MOD_CONTROL = 0x0002
ffi.cdef[[ struct HDC__ { int unused; }; typedef struct HDC__ *HDC; struct HWND__ { int unused; }; typedef struct HWND__ *HWND; struct HBRUSH__ { int unused; }; typedef struct HBRUSH__ *HBRUSH; struct HBITMAP__ { int unused; }; typedef struct HBITMAP__ *HBITMAP; struct HPEN__ { int unused; }; typedef struct HPEN__ *HPEN; struct HICON__ { int unused; }; typedef struct HICON__ *HICON; struct HMENU__ { int unused; }; typedef struct HMENU__ *HMENU; struct HINSTANCE__ { int unused; }; typedef struct HINSTANCE__ *HINSTANCE;
typedef struct { long left; long top; long right; long bottom;}RECT; typedef struct {long x; long y;} POINT, *PPOINT, *NPPOINT, *LPPOINT; typedef struct {unsigned long lbStyle;unsigned long lbColor; unsigned long lbHatch;} LOGBRUSH, *PLOGBRUSH, *NPLOGBRUSH, *LPLOGBRUSH;
typedef HICON HCURSOR; typedef void *HGDIOBJ; typedef void *PVOID; typedef unsigned int UINT; typedef long LONG; typedef unsigned int UINT_PTR, *PUINT_PTR; typedef long LONG_PTR, *PLONG_PTR; typedef UINT_PTR WPARAM; typedef LONG_PTR LPARAM; typedef unsigned long DWORD; typedef unsigned short WORD; typedef WORD ATOM; typedef int BOOL; typedef void VOID; typedef VOID *LPVOID; typedef LONG_PTR LRESULT;
typedef LONG (__stdcall* WNDPROC)(HWND, UINT, WPARAM, LONG);
typedef const char *LPCSTR, *PCSTR;
typedef struct { UINT style; WNDPROC lpfnWndProc; int cbClsExtra; int cbWndExtra; HINSTANCE hInstance; HICON hIcon; HCURSOR hCursor; HBRUSH hbrBackground; LPCSTR lpszMenuName; LPCSTR lpszClassName; } WNDCLASSA, *PWNDCLASSA, *NPWNDCLASSA, *LPWNDCLASSA;
typedef struct { HWND hwnd; UINT message; WPARAM wParam; LPARAM lParam; DWORD time; POINT pt; DWORD lPrivate; } MSG, *PMSG, *NPMSG, *LPMSG;
typedef struct { DWORD cbSize; RECT rcWindow; RECT rcClient; DWORD dwStyle; DWORD dwExStyle; DWORD dwWindowStatus; UINT cxWindowBorders; UINT cyWindowBorders; ATOM atomWindowType; WORD wCreatorVersion; } WINDOWINFO, *PWINDOWINFO, *LPWINDOWINFO;
HCURSOR LoadCursorA( HINSTANCE hInstance, LPCSTR lpCursorName );
ATOM RegisterClassA( const WNDCLASSA *lpWndClass );
BOOL UnregisterClassA( LPCSTR lpClassName, HINSTANCE hInstance );
HWND CreateWindowExA( DWORD dwExStyle, LPCSTR lpClassName, LPCSTR lpWindowName, DWORD dwStyle, int X, int Y, int nWidth, int nHeight, HWND hWndParent, HMENU hMenu, HINSTANCE hInstance, LPVOID lpParam );
BOOL DestroyWindow( HWND hWnd );
LRESULT DefWindowProcA( HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam);
BOOL PeekMessageA( LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT wMsgFilterMax, UINT wRemoveMsg );
BOOL GetMessageA( LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT wMsgFilterMax );
BOOL TranslateMessage( const MSG *lpMsg );
LRESULT DispatchMessageA( const MSG *lpMsg );
void PostQuitMessage( int nExitCode );
LRESULT SendMessageA( HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam );
BOOL GetCursorPos( LPPOINT lpPoint );
BOOL RegisterHotKey( HWND hWnd, int id, UINT fsModifiers, UINT vk );
BOOL UnregisterHotKey( HWND hWnd, int id );
typedef void (* TIMERPROC)(int, UINT, UINT, UINT); int SetTimer(HWND hWnd, UINT nIDEvent, UINT uElapse, TIMERPROC lpTimerFunc); bool KillTimer(HWND hWnd, UINT uIDEvent);
short GetAsyncKeyState(int vKey); HDC GetDC(HWND hWnd); HDC CreateCompatibleDC(HDC hdc); HBITMAP CreateCompatibleBitmap(HDC hdc, int cx, int cy); HGDIOBJ SelectObject(HDC hdc, HGDIOBJ h); HPEN CreatePen(int iStyle, int cWidth, unsigned long color); HPEN ExtCreatePen(unsigned long iPenStyle, unsigned long cWidth, const LOGBRUSH *plbrush, unsigned long cStyle, const unsigned long *pstyle); HBRUSH CreateSolidBrush(unsigned long color); bool StretchBlt(HDC hdcDest, int xDest, int yDest, int wDest, int hDest, HDC hdcSrc, int xSrc, int ySrc, int wSrc, int hSrc, unsigned long rop); bool BitBlt(HDC hdc, int x, int y, int cx, int cy, HDC hdcSrc, int x1, int y1, unsigned long rop); bool DeleteObject(HGDIOBJ ho); bool LineTo(HDC hdc, int x, int y); bool MoveToEx(HDC hdc, int x, int y, LPPOINT lppt); bool SystemParametersInfoA(unsigned int uiAction, unsigned int uiParam, PVOID pvParam, unsigned int fWinIni); int FillRect(HDC hDC, const RECT *lprc, HBRUSH hbr); ]]
-- позиция окна local windowposX = 0 local windowposY = 0
local move_to_mouse = function()end do local dsk_y = tonumber(desktopheight()) - window_size - 1 local side_area = true move_to_mouse = function() local m_x, m_y = mouse_pos("abs") local pos_x, pos_y = nil, nil if (m_x > window_size * 1.5 and side_area) or (m_x > window_size * 1.75 and not side_area) then pos_x = tonumber(m_x) - window_size * 1.5 side_area = true else pos_x = tonumber(m_x) + window_size / 2 side_area = false end pos_y = tonumber(m_y) - window_size / 2 pos_y = math.max(pos_y, 0) pos_y = math.min(pos_y, dsk_y) return pos_x, pos_y end end if follow_enable then windowposX, windowposY = move_to_mouse() end
-- хендл окна local main_window
local LOGBRUSH = ffi.new('LOGBRUSH', {BS_SOLID, COLOR_WHITE, 0}) local pstyle = ffi.new('int[2]', {1, 1}) local hdc local hdc2 = user.GetDC(ffi.cast('HWND', 0)) local Comp = gdi.CreateCompatibleDC(hdc2) local Comp2 = gdi.CreateCompatibleDC(hdc2) local bitmap = gdi.CreateCompatibleBitmap(hdc2, window_size, window_size) local bitmap2 = gdi.CreateCompatibleBitmap(hdc2, window_size, window_size) gdi.SelectObject(Comp, bitmap) gdi.SelectObject(Comp2, bitmap2) local Brush = gdi.CreateSolidBrush(COLOR_WHITE) local Pen_black = gdi.CreatePen(PS_SOLID, 1, COLOR_BLACK) local Pen = gdi.ExtCreatePen(PS_USERSTYLE, 1, LOGBRUSH, 2, pstyle) local rect = ffi.new('RECT', {0, 0, window_size, window_size}) local mouse_speed, mouse_speed_begin local zoom = 10
function zoom_control() if user.GetAsyncKeyState(90) ~= 0 then -- если нажата клавиша Z while user.GetAsyncKeyState(90) ~= 0 do wait(1) end if zoom > 1 then zoom = zoom - 1 end end if user.GetAsyncKeyState(88) ~= 0 then -- если нажата клавиша X while user.GetAsyncKeyState(88) ~= 0 do wait(1) end if zoom < 20 then zoom = zoom + 1 end end end
function SETMOUSESPEED(speed) local SPI_SETMOUSESPEED = 113 local mouse_speed = ffi.new('int[1]', speed) user.SystemParametersInfoA(SPI_SETMOUSESPEED, 0, ffi.cast('PVOID', mouse_speed[0]), 0) end function GETMOUSESPEED() local SPI_GETMOUSESPEED = 112 local mouse_speed = ffi.new('int[1]') user.SystemParametersInfoA(SPI_GETMOUSESPEED, 0, mouse_speed, 0) return mouse_speed[0] end
function mouse_control() if user.GetAsyncKeyState(67) ~= 0 then -- если нажата клавиша C while user.GetAsyncKeyState(67) ~= 0 do wait(1) end if GETMOUSESPEED() > 1 then mouse_speed = mouse_speed - 1 SETMOUSESPEED(mouse_speed) end end if user.GetAsyncKeyState(86) ~= 0 then -- если нажата клавиша V while user.GetAsyncKeyState(86) ~= 0 do wait(1) end if GETMOUSESPEED() < 20 then mouse_speed = mouse_speed + 1 SETMOUSESPEED(mouse_speed) end end end
function lupa() zoom_control() -- изменение масштаба вывода mouse_control() -- изменение скорости курсора
local mousePos = ffi.new('POINT') user.GetCursorPos (mousePos) local mouseX, mouseY = mousePos.x, mousePos.y
user.FillRect(Comp, rect, Brush) local pos = math.floor(window_size / 2 / zoom) local wSrc = math.floor(window_size / zoom) local hSrc = math.floor(window_size / zoom)
gdi.StretchBlt(Comp, 0, 0, wSrc * zoom, hSrc * zoom, hdc2, mouseX - pos, mouseY - pos, wSrc, hSrc, SRCCOPY) gdi.BitBlt(Comp2, 0, 0, window_size, window_size, Comp, 0, 0, SRCCOPY)
local delta = math.floor(pos * zoom + zoom / 2) local oldPen = gdi.SelectObject(Comp2, Pen_black) gdi.MoveToEx(Comp2, 0, delta, ffi.cast('LPPOINT', 0)) gdi.LineTo(Comp2, window_size, delta) gdi.MoveToEx(Comp2, delta, 0, ffi.cast('LPPOINT', 0)) gdi.LineTo(Comp2,delta, window_size) gdi.SelectObject(Comp2, oldPen) oldPen = gdi.SelectObject(Comp2, Pen) gdi.MoveToEx(Comp2, 0, delta, ffi.cast('LPPOINT', 0)) gdi.LineTo(Comp2, window_size, delta) gdi.MoveToEx(Comp2, delta, 0, ffi.cast('LPPOINT', 0)) gdi.LineTo(Comp2, delta, window_size) gdi.SelectObject(Comp2, oldPen) gdi.BitBlt(hdc, 0, 0, window_size, window_size, Comp2, 0, 0, SRCCOPY) end
local function WindowProc(hWnd, message, wParam, lParam) if message == WM_HOTKEY then user.UnregisterHotKey(main_window, 1111) user.SendMessageA(main_window, WM_CLOSE, 0, 0) end
if message == WM_CLOSE or message == WM_HOTKEY then SETMOUSESPEED(mouse_speed_begin)
user.KillTimer(main_window, 1111) ffi.C.PostQuitMessage(0) end
return ffi.C.DefWindowProcA(hWnd, message, wParam, lParam) end
local lua_window = function (...) local window_class = 'MywindowClass' local wcWindowClass = ffi.new('WNDCLASSA', 0) wcWindowClass.lpfnWndProc = WindowProc wcWindowClass.lpszClassName = window_class wcWindowClass.hCursor = ffi.C.LoadCursorA(ffi.cast('HINSTANCE', NULL), ffi.cast('LPCSTR', IDC_ARROW)) wcWindowClass.hbrBackground = ffi.cast('HBRUSH', COLOR_WINDOW) ffi.C.RegisterClassA(wcWindowClass) main_window = ffi.C.CreateWindowExA(WS_EX_TOPMOST, window_class, '', WS_VISIBLE + WS_POPUP, windowposX, windowposY, window_size, window_size, ffi.cast('HWND', 0), ffi.cast('HMENU', 0), ffi.cast('HINSTANCE', 0), ffi.cast('LPVOID', 0))
hdc = user.GetDC(ffi.cast('HWND', main_window)) ffi.C.SetTimer(main_window, 1111, 10, lupa) user.RegisterHotKey(main_window, 1111, MOD_CONTROL + MOD_SHIFT, 90); -- Ctrl + Shift + Z
wnd.zoom = tonumber(ffi.cast('int', main_window)) workwindow(wnd.zoom) local message = ffi.new('MSG') repeat lupa() local bRet = ffi.C.GetMessageA(message, NULL, 0, 0) if bRet == -1 then break end ffi.C.TranslateMessage(message) ffi.C.DispatchMessageA(message)
if follow_enable then local pos_x, pos_y = move_to_mouse() windowpos(pos_x, pos_y, window_size, window_size) end
until bRet == 0
ffi.C.DestroyWindow(main_window) ffi.C.UnregisterClassA(window_class, ffi.cast('HINSTANCE', 0)) end
mouse_speed_begin = GETMOUSESPEED() mouse_speed = mouse_speed_begin lua_window() Сообщение отредактировал DarkMaster - 30.3.2022, 17:35
--------------------
Скрипты UOPilot под заказ. Консультации по UOpilot 15$/час. Услуги Lua разработчика (не пилот, проекты, постоянка) Disсоrd: Kov____
|
|
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|