Полезные сниппеты и функции

Орк

Известный
311
264
Описание: Скриншот экрана, который сохраняется в буфер обмена, типа Print Screen. Не знаю зачем, но пусть будет.
Пример использования:
Lua:
screenshotToClipboard()
Код:
Lua:
local ffi = require("ffi")

ffi.cdef[[
    typedef void* HANDLE;
    typedef void* HDC;
    typedef void* HBITMAP;
    typedef const char* LPCSTR;
    typedef unsigned int UINT;
    typedef int BOOL;
    typedef unsigned long DWORD;

    HDC GetDC(void* hWnd);
    int ReleaseDC(void* hWnd, HDC hDC);
    int GetSystemMetrics(int nIndex);
    HDC CreateCompatibleDC(HDC hdc);
    HBITMAP CreateCompatibleBitmap(HDC hdc, int cx, int cy);
    HBITMAP SelectObject(HDC hdc, HBITMAP h);
    BOOL BitBlt(HDC hdcDest, int xDest, int yDest, int w, int h, HDC hdcSrc, int xSrc, int ySrc, DWORD rop);
    BOOL DeleteDC(HDC hdc);
    BOOL DeleteObject(HBITMAP hObject);

    BOOL OpenClipboard(void* hWndNewOwner);
    BOOL EmptyClipboard();
    BOOL CloseClipboard();
    HANDLE SetClipboardData(UINT uFormat, HANDLE hMem);

    enum { SM_CXSCREEN = 0, SM_CYSCREEN = 1 };
    enum { SRCCOPY = 0x00CC0020 };
    enum { CF_BITMAP = 2 };
]]

local user32 = ffi.load("user32")
local gdi32 = ffi.load("gdi32")

function screenshotToClipboard()
    local width = user32.GetSystemMetrics(0)
    local height = user32.GetSystemMetrics(1)

    local hdcScreen = user32.GetDC(nil)
    local hdcMem = gdi32.CreateCompatibleDC(hdcScreen)
    local hBitmap = gdi32.CreateCompatibleBitmap(hdcScreen, width, height)

    if hBitmap == nil then
        print("Не удалось создать совместимый битмап.")
        user32.ReleaseDC(nil, hdcScreen)
        return
    end

    gdi32.SelectObject(hdcMem, hBitmap)
    gdi32.BitBlt(hdcMem, 0, 0, width, height, hdcScreen, 0, 0, ffi.C.SRCCOPY)

    if user32.OpenClipboard(nil) ~= 0 then
        user32.EmptyClipboard()
        user32.SetClipboardData(ffi.C.CF_BITMAP, hBitmap)
        user32.CloseClipboard()
        print("Скриншот скопирован в буфер обмена.")
    else
        print("Не удалось открыть буфер обмена.")
    end

    gdi32.DeleteDC(hdcMem)
    user32.ReleaseDC(nil, hdcScreen)
    gdi32.DeleteObject(hBitmap)
end
Lua:
local ffi = require("ffi")

ffi.cdef[[
    typedef void* HANDLE;
    typedef void* HDC;
    typedef void* HBITMAP;
    typedef const char* LPCSTR;
    typedef unsigned int UINT;
    typedef int BOOL;
    typedef unsigned long DWORD;

    HDC GetDC(void* hWnd);
    int GetSystemMetrics(int nIndex);
    HDC CreateCompatibleDC(HDC hdc);
    HBITMAP CreateCompatibleBitmap(HDC hdc, int cx, int cy);
    HBITMAP SelectObject(HDC hdc, HBITMAP h);
    BOOL BitBlt(HDC hdcDest, int xDest, int yDest, int w, int h, HDC hdcSrc, int xSrc, int ySrc, DWORD rop);
    BOOL DeleteDC(HDC hdc);
    BOOL DeleteObject(HBITMAP hObject);

    BOOL OpenClipboard(void* hWndNewOwner);
    BOOL EmptyClipboard();
    BOOL CloseClipboard();
    HANDLE SetClipboardData(UINT uFormat, HANDLE hMem);

    HANDLE GlobalAlloc(UINT uFlags, size_t dwBytes);
    HANDLE GlobalLock(HANDLE hMem);
    BOOL GlobalUnlock(HANDLE hMem);
    BOOL IsClipboardFormatAvailable(UINT format);
   
    BOOL OpenClipboard(void*);
    BOOL CloseClipboard();
    enum { SM_CXSCREEN = 0, SM_CYSCREEN = 1 };
    enum { SRCCOPY = 0x00CC0020 };
    enum { CF_BITMAP = 2 };
]]

local user32 = ffi.load("user32")
local gdi32 = ffi.load("gdi32")
local kernel32 = ffi.load("kernel32")

function screenshotToClipboard()
    local width = user32.GetSystemMetrics(0)
    local height = user32.GetSystemMetrics(1)

    local hdcScreen = user32.GetDC(nil)
    local hdcMem = gdi32.CreateCompatibleDC(hdcScreen)
    local hBitmap = gdi32.CreateCompatibleBitmap(hdcScreen, width, height)
    gdi32.SelectObject(hdcMem, hBitmap)
    gdi32.BitBlt(hdcMem, 0, 0, width, height, hdcScreen, 0, 0, ffi.C.SRCCOPY)

    if user32.OpenClipboard(nil) ~= 0 then
        user32.EmptyClipboard()
        user32.SetClipboardData(ffi.C.CF_BITMAP, hBitmap)
        user32.CloseClipboard()
        print("Скриншот скопирован в буфер обмена.")
    else
        print("Не удалось открыть буфер обмена.")
    end

    -- очистка
    gdi32.DeleteDC(hdcMem)
    -- hBitmap не удаляем, т.к. он теперь в буфере обмена
end
 
Последнее редактирование:

Tectrex

Известный
134
163
Описание: Скриншот экрана, который сохраняется в буфер обмена, типа Print Screen. Не знаю зачем, но пусть будет.
Пример использования:
Lua:
screenshotToClipboard()
Код:
Lua:
local ffi = require("ffi")

ffi.cdef[[
    typedef void* HANDLE;
    typedef void* HDC;
    typedef void* HBITMAP;
    typedef const char* LPCSTR;
    typedef unsigned int UINT;
    typedef int BOOL;
    typedef unsigned long DWORD;

    HDC GetDC(void* hWnd);
    int GetSystemMetrics(int nIndex);
    HDC CreateCompatibleDC(HDC hdc);
    HBITMAP CreateCompatibleBitmap(HDC hdc, int cx, int cy);
    HBITMAP SelectObject(HDC hdc, HBITMAP h);
    BOOL BitBlt(HDC hdcDest, int xDest, int yDest, int w, int h, HDC hdcSrc, int xSrc, int ySrc, DWORD rop);
    BOOL DeleteDC(HDC hdc);
    BOOL DeleteObject(HBITMAP hObject);

    BOOL OpenClipboard(void* hWndNewOwner);
    BOOL EmptyClipboard();
    BOOL CloseClipboard();
    HANDLE SetClipboardData(UINT uFormat, HANDLE hMem);

    HANDLE GlobalAlloc(UINT uFlags, size_t dwBytes);
    HANDLE GlobalLock(HANDLE hMem);
    BOOL GlobalUnlock(HANDLE hMem);
    BOOL IsClipboardFormatAvailable(UINT format);
   
    BOOL OpenClipboard(void*);
    BOOL CloseClipboard();
    enum { SM_CXSCREEN = 0, SM_CYSCREEN = 1 };
    enum { SRCCOPY = 0x00CC0020 };
    enum { CF_BITMAP = 2 };
]]

local user32 = ffi.load("user32")
local gdi32 = ffi.load("gdi32")
local kernel32 = ffi.load("kernel32")

function screenshotToClipboard()
    local width = user32.GetSystemMetrics(0)
    local height = user32.GetSystemMetrics(1)

    local hdcScreen = user32.GetDC(nil)
    local hdcMem = gdi32.CreateCompatibleDC(hdcScreen)
    local hBitmap = gdi32.CreateCompatibleBitmap(hdcScreen, width, height)
    gdi32.SelectObject(hdcMem, hBitmap)
    gdi32.BitBlt(hdcMem, 0, 0, width, height, hdcScreen, 0, 0, ffi.C.SRCCOPY)

    if user32.OpenClipboard(nil) ~= 0 then
        user32.EmptyClipboard()
        user32.SetClipboardData(ffi.C.CF_BITMAP, hBitmap)
        user32.CloseClipboard()
        print("Скриншот скопирован в буфер обмена.")
    else
        print("Не удалось открыть буфер обмена.")
    end

    -- очистка
    gdi32.DeleteDC(hdcMem)
    -- hBitmap не удаляем, т.к. он теперь в буфере обмена
end
я не догнал, а ReleaseDC не надо вызывать шоль?
 
  • Нравится
Реакции: Орк

chapo

tg/inst: @moujeek
Всефорумный модератор
9,083
12,092
Описание: небольшой пародия на iota из Go
Код:
Lua:
local iota = setmetatable({ value = -1 }, {
    __call = function(self, newValue)
        self.value = newValue or self.value + 1;
        return self.value;
    end
});
Пример использования:
Lua:
local iota = setmetatable({ value = -1 }, {
    __call = function(self, newValue)
        self.value = newValue or self.value + 1;
        return self.value;
    end
});

Packet = {
    Connect = iota(),
    ConnectResponse = iota(),
    BotConnect = iota(),
    BotDisconnect = iota()
};

print(Packet.Connect, Packet.ConnectResponse, Packet.BotConnect, Packet.BotDisconnect);
1745317523431.png
 

Орк

Известный
311
264
Описание: *Изменяет цвет текста в EditBox диалога*
Lua:
function editDialogEditBoxTextColor(color)
    local pDialog = memory.read(getModuleHandle("samp.dll") + 0x21A0B8, 4, true)
    local pEditBox = memory.read(pDialog + 0x24, 4, true)
    memory.write(pEditBox + 0x127, color, true)
end
Пример использования:
Lua:
function main()   
     editDialogEditBoxTextColor(0xFF00FF00) -- argb color (Green)
end
За столько времени никто не сказал, что он забыл memory.write(pEditBox + 0x127, color, uint size, true) поставить.
А я голову ломал, почему в диалогах не меняется цвет, даже по-другому сделал.
Lua:
--    ['R1'] = 0x21A0B8 , ['R2'] = 0x21A0C0, 
--    ['R3-1'] = 0x26E898, ['R4'] = 0x26E9C8, 
--    ['R4-2'] = 0x26E9C8, ['R5'] = 0x26EB50, ['DL-R1'] = 0x2AC9E0}
function SetDialogInputColors(color)
    local p = memory.getint32(memory.getint32(getModuleHandle('samp.dll') + 0x26E898) + 0x24)
    if p == 0 then return end
    memory.setuint32(p + 0x127, color) -- Цвет текста
    memory.setuint32(p + 0x133, color) -- символа | на конце
end
Возможно нужно запускать в беск. цикле
1745340369426.png
 
  • Нравится
  • Эм
Реакции: Tema05 и VanoKLR