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

 
Ответить в эту темуОткрыть новую тему
> Лупа, Готовый скрипт
cirus
сообщение 3.4.2020, 14:56
Сообщение #1


**********

Elder
Сообщений: 3.480
Регистрация: 18.8.2014
Группа: Пользователи
Наличность: 26707
Пользователь №: 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
Пользователь в онлайне!Delete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
FREEON
сообщение 3.4.2020, 18:54
Сообщение #2


*****

Journeyman
Сообщений: 365
Регистрация: 14.2.2017
Группа: Пользователи
Наличность: 1318
Пользователь №: 18.346
Возраст: 25



возможности lua не перестают удивлять...
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
DarkMaster
сообщение 27.9.2020, 15:37
Сообщение #3


***********

Модератор UOPilot
Сообщений: 9.467
Регистрация: 2.12.2008
Группа: Супермодераторы
Наличность: 27722
Пользователь №: 11.279



Сам писал?


--------------------
Скрипты UOPilot под заказ.
Консультации по UOpilot 15$/час.
Услуги Lua разработчика (не пилот, проекты, постоянка)
Disсоrd:
Kov____
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
cirus
сообщение 27.9.2020, 20:16
Сообщение #4


**********

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



Цитата
Сам писал?

Да.
Пользователь в онлайне!Delete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
DarkMaster
сообщение 27.9.2020, 21:15
Сообщение #5


***********

Модератор UOPilot
Сообщений: 9.467
Регистрация: 2.12.2008
Группа: Супермодераторы
Наличность: 27722
Пользователь №: 11.279



Крут. А в оверлей реально выводить?


--------------------
Скрипты UOPilot под заказ.
Консультации по UOpilot 15$/час.
Услуги Lua разработчика (не пилот, проекты, постоянка)
Disсоrd:
Kov____
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
cirus
сообщение 27.9.2020, 21:26
Сообщение #6


**********

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



Цитата
А в оверлей реально выводить?

Не знаю. Можно в окно, которое поверх всех.
Пользователь в онлайне!Delete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
DarkMaster
сообщение 28.9.2020, 0:08
Сообщение #7


***********

Модератор UOPilot
Сообщений: 9.467
Регистрация: 2.12.2008
Группа: Супермодераторы
Наличность: 27722
Пользователь №: 11.279



Цитата
Можно в окно, которое поверх всех.

При фул скрине будут проблемы. По этому я про оверлей и спросил)


--------------------
Скрипты UOPilot под заказ.
Консультации по UOpilot 15$/час.
Услуги Lua разработчика (не пилот, проекты, постоянка)
Disсоrd:
Kov____
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
DarkMaster
сообщение 29.3.2022, 18:21
Сообщение #8


***********

Модератор UOPilot
Сообщений: 9.467
Регистрация: 2.12.2008
Группа: Супермодераторы
Наличность: 27722
Пользователь №: 11.279



Повыкидывал вейты, все обработки кроме лупы - моргать почти перестало, но весь экран в артефактах пока окошками не подвигаешь.
Ну и если выжимать по максимуму - лучше убрать все приведения типов и указание параметров константами, т.к. скорее всего они хранятся double до момента передачи. Практика показала, что касты достаточно много жрут. Я бы даже сказал неожиданно много, а тут убранный wait(1) дал очень большой прирост.

Насколько запарно лупу перенести на borderless формочку поверх всех окон? Я с окошками очень слабо(


--------------------
Скрипты UOPilot под заказ.
Консультации по UOpilot 15$/час.
Услуги Lua разработчика (не пилот, проекты, постоянка)
Disсоrd:
Kov____
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
cirus
сообщение 30.3.2022, 12:14
Сообщение #9


**********

Elder
Сообщений: 3.480
Регистрация: 18.8.2014
Группа: Пользователи
Наличность: 26707
Пользователь №: 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. При закрытии окна скорость курсора будет восстановлена.
Пользователь в онлайне!Delete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
DarkMaster
сообщение 30.3.2022, 12:22
Сообщение #10


***********

Модератор UOPilot
Сообщений: 9.467
Регистрация: 2.12.2008
Группа: Супермодераторы
Наличность: 27722
Пользователь №: 11.279



Цитата
При закрытии окна скорость курсора будет восстановлена.

Не знаю почему, но у первой версии лупы скорость мыши почему-то становилась 2 (у меня в системе 1).

Пошел тестить. Спасибо.

Почему имнно так константы задаешь?
ffi.cast('LPPOINT', 0)


--------------------
Скрипты UOPilot под заказ.
Консультации по UOpilot 15$/час.
Услуги Lua разработчика (не пилот, проекты, постоянка)
Disсоrd:
Kov____
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
cirus
сообщение 30.3.2022, 12:31
Сообщение #11


**********

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



Цитата
Почему имнно так константы задаешь?
ffi.cast('LPPOINT', 0)

Не помню, код давно написан. Можно nil передавать.
Пользователь в онлайне!Delete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
DarkMaster
сообщение 30.3.2022, 13:46
Сообщение #12


***********

Модератор UOPilot
Сообщений: 9.467
Регистрация: 2.12.2008
Группа: Супермодераторы
Наличность: 27722
Пользователь №: 11.279



Не хочется наглеть, но тем не менее) А borderless можно? Ну типа окно без рамок. Килять можно хоткей выставить.


--------------------
Скрипты UOPilot под заказ.
Консультации по UOpilot 15$/час.
Услуги Lua разработчика (не пилот, проекты, постоянка)
Disсоrd:
Kov____
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
cirus
сообщение 30.3.2022, 14:01
Сообщение #13


**********

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



Цитата
окно без рамок

Код
local WS_POPUP = 0x80000000
main_window = ffi.C.CreateWindowExA(WS_EX_TOPMOST, window_class, 'Лупа', WS_VISIBLE + WS_POPUP, ...

Пользователь в онлайне!Delete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
DarkMaster
сообщение 30.3.2022, 14:22
Сообщение #14


***********

Модератор UOPilot
Сообщений: 9.467
Регистрация: 2.12.2008
Группа: Супермодераторы
Наличность: 27722
Пользователь №: 11.279



Без рамок завершить не представляется возможным ввиду того, что креста нет, а при стопе окно виснет напрочь. Повторный запуск = краш пилота. Нужен хоткей (ну с этим понятно как) который будет закрывать окошко(тут хз) и только после этого стопать луа машину.


--------------------
Скрипты UOPilot под заказ.
Консультации по UOpilot 15$/час.
Услуги Lua разработчика (не пилот, проекты, постоянка)
Disсоrd:
Kov____
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
cirus
сообщение 30.3.2022, 14:53
Сообщение #15


**********

Elder
Сообщений: 3.480
Регистрация: 18.8.2014
Группа: Пользователи
Наличность: 26707
Пользователь №: 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()
Пользователь в онлайне!Delete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
DarkMaster
сообщение 30.3.2022, 15:16
Сообщение #16


***********

Модератор UOPilot
Сообщений: 9.467
Регистрация: 2.12.2008
Группа: Супермодераторы
Наличность: 27722
Пользователь №: 11.279



Шуршит шикарно.
Последний вопрос (IMG:style_emoticons/default/smile.gif)
Как кастом привести хендл к стандартному луашному типу?
Работает старое доброе, но кровь из глаз идет:
Код
    local r = tonumber(string.match(tostring(main_window), [[>: (.+)]]))
    workwindow(r)

приведение к инту и инт->дабл(стандарт для луа) эффекта не дали, workwindow есть не хочет.


--------------------
Скрипты UOPilot под заказ.
Консультации по UOpilot 15$/час.
Услуги Lua разработчика (не пилот, проекты, постоянка)
Disсоrd:
Kov____
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
DarkMaster
сообщение 30.3.2022, 17:33
Сообщение #17


***********

Модератор UOPilot
Сообщений: 9.467
Регистрация: 2.12.2008
Группа: Супермодераторы
Наличность: 27722
Пользователь №: 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____
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Cockney
сообщение 30.3.2022, 18:35
Сообщение #18


********

Master
Сообщений: 1.395
Регистрация: 22.6.2013
Группа: Пользователи
Наличность: 21061
Пользователь №: 16.156



tonumber(ffi.cast('void*', main_window))

если луа так может или на крайний случай

tonumber(ffi.cast('unsigned long long', main_window))
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
DarkMaster
сообщение 30.3.2022, 22:27
Сообщение #19


***********

Модератор UOPilot
Сообщений: 9.467
Регистрация: 2.12.2008
Группа: Супермодераторы
Наличность: 27722
Пользователь №: 11.279



Цитата
tonumber(ffi.cast('void*', main_window))

так только через два каста можно.


--------------------
Скрипты UOPilot под заказ.
Консультации по UOpilot 15$/час.
Услуги Lua разработчика (не пилот, проекты, постоянка)
Disсоrd:
Kov____
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения

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

 

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