SA:MP Lua isCaps | Включен ли капслок на IME

ARMOR

Waitin' on another black summer to end
Автор темы
Модератор
5,045
7,236
Версия SA-MP
  1. 0.3.7-R3
Вспомнилось что у Аризоны раньше указывалось включен ли капслок на иконке раскладки возле инпута текста. Время на часах 4 ночи, и мне захотелось сделать также. Зачем? Да чтобы было

Версии SAMP: 0.3.7 R3

Описание:
Изменяет текст раскладки клавиатуры на большой если у вас включен капслок, и на маленький если выключен. При нажатии на эту кнопку изменяет раскладку на следующую

Скриншоты:

sa-mp-035.png

sa-mp-036.png
 

Вложения

  • isCaps.lua
    2.7 KB · Просмотры: 17
Последнее редактирование:

Tema05

Известный
1,531
501
Написать asi/sf плагин на плюсах?
- неееее
Написать lua скрипт, который полностью состоит из вызовов C-функций через ffi с непотокобезопасными хуками?
- ДААА!!

База луашеров в 2025)
 

ARMOR

Waitin' on another black summer to end
Автор темы
Модератор
5,045
7,236
Написать asi/sf плагин на плюсах?
- неееее
Написать lua скрипт, который полностью состоит из вызовов C-функций через ffi с непотокобезопасными хуками?
- ДААА!!

База луашеров в 2025)
Ты полностью прав
1749522471601.png
 
  • Нравится
Реакции: вайега52

RTD

Потужно
Модератор
407
483
Написать asi/sf плагин на плюсах?
- неееее
Написать lua скрипт, который полностью состоит из вызовов C-функций через ffi с непотокобезопасными хуками?
- ДААА!!

База луашеров в 2025)
Что лучше, lua скрипт который полностью состоит из вызовов C-функций через ffi с непотокобезопасными хуками или полное прекращение работы мунлоадер на аризона?

Что лучше, lua скрипт который полностью состоит из C-кода или полное прекращение работы мунлоадер на аризона?
Lua:
local tcc = require("libtcc")
assert(tcc.VERSION_NUM >= 2, "Update libtcc")
local prog = tcc.cdef[[
    #include <windows.h>

    struct {
        char* addr;
        int(__thiscall *orig)(void* this, wchar_t* strText, void* pElement, RECT* prcDest, _Bool bShadow, int nCount);
    } hook;

    int __thiscall CDXUTDialog__DrawTextHook(void* this, wchar_t* strText, void* pElement, RECT* prcDest, _Bool bShadow, int nCount) {
        strText = (GetKeyState(VK_CAPITAL) & 0x0001) ? CharUpperW(strText) : CharLowerW(strText);
        return hook.orig(this, strText, pElement, prcDest, bShadow, nCount);
    }

    void Main() {
        uintptr_t sampdll = (uintptr_t)GetModuleHandleA("samp.dll");
        hook.orig = (void*)(sampdll + 0x8CCC0);
        hook.addr = (void*)(sampdll + 0x9008D);
       
        DWORD oldProt;
        VirtualProtect(hook.addr, 5, PAGE_EXECUTE_READWRITE, &oldProt);
        *(uintptr_t*)(hook.addr + 1) = (uintptr_t)&CDXUTDialog__DrawTextHook - (uintptr_t)hook.addr - 5;
        VirtualProtect(hook.addr, 5, oldProt, &oldProt);
    }
    void OnGarbageCollection() {
        DWORD oldProt;
        VirtualProtect(hook.addr, 5, PAGE_EXECUTE_READWRITE, &oldProt);
        *(uintptr_t*)(hook.addr + 1) = 0xffffcc2e;
        VirtualProtect(hook.addr, 5, oldProt, &oldProt);
    }
]]
local s = tcc.new()
s:compile_string(prog)
s:relocate()
s:get_symbol("Main", "void(*)()")()
main = function() wait(-1) end