Исходник Гайд mimhotkey - бинды в mimgui!

EX4MPLYCH

Участник
42
6
Есть проблема. Забинженнная кнопка реагирует даже тогда, когда набираешь текст в чат. (Пишешь что нибудь и нажал кнопку а на ней бинд и происходит действие).
Будет ли возможность задействовать кнопки мыши для бинда?
 

chapo

чопа сребдс // @moujeek
Автор темы
Модератор
8,891
11,621
Есть проблема. Забинженнная кнопка реагирует даже тогда, когда набираешь текст в чат. (Пишешь что нибудь и нажал кнопку а на ней бинд и происходит действие).
Будет ли возможность задействовать кнопки мыши для бинда?
1. в коллбеке проверяй открытие чата
2. скорее всего нет
 
  • Нравится
Реакции: EX4MPLYCH

XRLM

Против ветра рождённый
Проверенный
1,511
1,079
1. в коллбеке проверяй открытие чата
2. скорее всего нет
а что про альт и т.п. клавиши? с ними ток сочетание клавиш биндится. приходится делать бинд по ид или названию клавиш
 
  • Клоун
Реакции: Air_Official

Gorskin

♥ Love Lua ♥
Проверенный
1,337
1,176
Чапо почему нельзя биндить ALT+G и вообще всё что начинается на ALT ?
Че это за позор. Фикси.
И вот это пиздец конечно решение...
Screenshot_2.png

Иначе не сохраняется нихуя вообще.
 

Vespan

Чешский луашер
Проверенный
2,121
1,721
Lua:
imgui = require'imgui'
KEY = '[]'
function main()
    while not isSampAvailable() do wait(10) end
    hotkey().register('K',KEY,false,false,function() sampAddChatMessage('123!',-1) end)
    imgui.Process = true
    wait(-1)
end
function imgui.OnDrawFrame()
    local sw,sh = getScreenResolution()
    imgui.SetNextWindowPos(imgui.ImVec2(sw/2,sh/2), imgui.Cond.FirstUseEver)
    imgui.Begin('test hotkeys',nil,64)
    if hotkey().imgui('name text','name button','K') then
        -- KEY = hotkey().getKeys('K')
        -- ini.test.key = hotkey().getKeys('K')
        --save ini
    end
    imgui.End()
end

function hotkey()
    local vkeys = require'vkeys'
    if HOTKEY == nil then
        HOTKEY = {
            wait_for_key = 'press any key..',
            no_key = 'none',
            list = {},
            eventHandlers = false,
        }
    end
local function getKeysNameByBind(keys)
    local t = {}
    for k,v in ipairs(keys) do; table.insert(t,vkeys.id_to_name(v)); end
    return (#t == 0 and HOTKEY.no_key or (#t == 1 and table.concat(t,'') or table.concat(t,' + ')))
end
    local c = {}
    function c.register(hk,keys,keyDown,activeOnCursorActive,callback)
        if HOTKEY.list[hk] == nil then
            keys = decodeJson(keys or '{}')
            HOTKEY.list[hk] = {
                edit = false,
                tick = os.clock(),
                keys = keys,
                keyDown = keyDown,
                activeOnCursorActive = activeOnCursorActive,
                callback = callback,
            };  return true
        end;    return false
    end
    function c.unregister(hk)
        if HOTKEY.list[hk] == nil then;   return false;    end
        HOTKEY.list[hk] = nil
        return true
    end
    function c.imgui(name,textInButton,hk,width)
        textInButton = (textInButton == nil and '' or (#textInButton == 0 and '' or (textInButton .. ' ')) )
        local b = false
        local h = HOTKEY.list[hk]
        imgui.Text(name)
        imgui.SameLine()
        if h == nil then;   imgui.Button(textInButton.."NOT FIND HOTKEY "..hk);   return false; end
        if not h.edit then; h.tick = os.clock();    end
        if os.clock()-h.tick >= 1 then;    h.tick = os.clock();    end
        imgui.PushStyleColor(imgui.Col.Text,(os.clock()-h.tick) <= 0.5 and imgui.GetStyle().Colors[imgui.Col.Text] or imgui.ImVec4(1,1,1,0))
        if imgui.Button(textInButton.. (h.edit and (#h.keys == 0 and HOTKEY.wait_for_key or getKeysNameByBind(h.keys)) or getKeysNameByBind(h.keys) .. '##'..hk),imgui.ImVec2(width or 0,0)) then
            h.edit = true;  h.keys = {}
        end
        imgui.PopStyleColor(1)
        if h.edit then
            for k,v in pairs(vkeys) do
                if isKeyDown(v) and (v ~= VK_MENU and v ~= VK_CONTROL and v ~= VK_SHIFT) then
                    for kk,vv in ipairs(h.keys) do
                        if v == vv then;    goto s; end
                    end
                    table.insert(h.keys,v)
                    h.tick = os.clock()
                    ::s::
                    if #h.keys > 2 then
                        for i = 3,#h.keys do;   table.remove(h.keys,i);    end
                    end
                else
                    for kk,vv in ipairs(h.keys) do
                        if v == vv then;    h.edit = false; b = true;   end
                    end
                end
            end--
            if isKeyJustPressed(VK_BACK) then;  h.keys = {};    h.edit = false;   end

        end
        return b
    end
    function c.getKeys(hk)
        return HOTKEY.list[hk].keys == nil and 'nil_'..hk or encodeJson(HOTKEY.list[hk].keys or '{}')
    end
    if not HOTKEY.eventHandlers then
        addEventHandler("onWindowMessage",
            function (message, wparam, lparam)     
                for k,v in pairs(HOTKEY.list) do
                    if v.edit then
                        if message == 0x0102 then--CHAR
                            consumeWindowMessage(true,true)
                        elseif message == 0x0008 then--KILLFOCUS
                            v.edit = false
                            v.keys = {}
                        end
                    end
                end
            end
        )
        lua_thread.create(function()
            while true do wait(0)
            -- addEventHandler('onD3DPresent',function()
                if HOTKEY~=nil then
                    for k,v in pairs(HOTKEY.list) do
                        if HOTKEY.list[k] ~= nil and v.activeOnCursorActive and true or not (sampIsCursorActive() or sampIsDialogActive() or sampIsChatInputActive()) and not v.edit then
                            
                            if v.keyDown and (#v.keys == 1 and isKeyDown(v.keys[1]) or #v.keys == 2 and (isKeyDown(v.keys[1]) and isKeyDown(v.keys[2])) or false) or (#v.keys == 1 and isKeyJustPressed(v.keys[1]) or #v.keys == 2 and (isKeyDown(v.keys[1]) and isKeyJustPressed(v.keys[2])) or false)  then
                                v.callback()
                            end

                        end

                    end
                end
            end
        end)
        HOTKEY.eventHandlers = true
    end

    return c
end
1674164471205.png

╤Й╨╜╤Е╨╝╤И0╨╜╨░70╨╜╨░.jpg
 

Gorskin

♥ Love Lua ♥
Проверенный
1,337
1,176
Lua:
imgui = require'imgui'
KEY = '[]'
function main()
    while not isSampAvailable() do wait(10) end
    hotkey().register('K',KEY,false,false,function() sampAddChatMessage('123!',-1) end)
    imgui.Process = true
    wait(-1)
end
function imgui.OnDrawFrame()
    local sw,sh = getScreenResolution()
    imgui.SetNextWindowPos(imgui.ImVec2(sw/2,sh/2), imgui.Cond.FirstUseEver)
    imgui.Begin('test hotkeys',nil,64)
    if hotkey().imgui('name text','name button','K') then
        -- KEY = hotkey().getKeys('K')
        -- ini.test.key = hotkey().getKeys('K')
        --save ini
    end
    imgui.End()
end

function hotkey()
    local vkeys = require'vkeys'
    if HOTKEY == nil then
        HOTKEY = {
            wait_for_key = 'press any key..',
            no_key = 'none',
            list = {},
            eventHandlers = false,
        }
    end
local function getKeysNameByBind(keys)
    local t = {}
    for k,v in ipairs(keys) do; table.insert(t,vkeys.id_to_name(v)); end
    return (#t == 0 and HOTKEY.no_key or (#t == 1 and table.concat(t,'') or table.concat(t,' + ')))
end
    local c = {}
    function c.register(hk,keys,keyDown,activeOnCursorActive,callback)
        if HOTKEY.list[hk] == nil then
            keys = decodeJson(keys or '{}')
            HOTKEY.list[hk] = {
                edit = false,
                tick = os.clock(),
                keys = keys,
                keyDown = keyDown,
                activeOnCursorActive = activeOnCursorActive,
                callback = callback,
            };  return true
        end;    return false
    end
    function c.unregister(hk)
        if HOTKEY.list[hk] == nil then;   return false;    end
        HOTKEY.list[hk] = nil
        return true
    end
    function c.imgui(name,textInButton,hk,width)
        textInButton = (textInButton == nil and '' or (#textInButton == 0 and '' or (textInButton .. ' ')) )
        local b = false
        local h = HOTKEY.list[hk]
        imgui.Text(name)
        imgui.SameLine()
        if h == nil then;   imgui.Button(textInButton.."NOT FIND HOTKEY "..hk);   return false; end
        if not h.edit then; h.tick = os.clock();    end
        if os.clock()-h.tick >= 1 then;    h.tick = os.clock();    end
        imgui.PushStyleColor(imgui.Col.Text,(os.clock()-h.tick) <= 0.5 and imgui.GetStyle().Colors[imgui.Col.Text] or imgui.ImVec4(1,1,1,0))
        if imgui.Button(textInButton.. (h.edit and (#h.keys == 0 and HOTKEY.wait_for_key or getKeysNameByBind(h.keys)) or getKeysNameByBind(h.keys) .. '##'..hk),imgui.ImVec2(width or 0,0)) then
            h.edit = true;  h.keys = {}
        end
        imgui.PopStyleColor(1)
        if h.edit then
            for k,v in pairs(vkeys) do
                if isKeyDown(v) and (v ~= VK_MENU and v ~= VK_CONTROL and v ~= VK_SHIFT) then
                    for kk,vv in ipairs(h.keys) do
                        if v == vv then;    goto s; end
                    end
                    table.insert(h.keys,v)
                    h.tick = os.clock()
                    ::s::
                    if #h.keys > 2 then
                        for i = 3,#h.keys do;   table.remove(h.keys,i);    end
                    end
                else
                    for kk,vv in ipairs(h.keys) do
                        if v == vv then;    h.edit = false; b = true;   end
                    end
                end
            end--
            if isKeyJustPressed(VK_BACK) then;  h.keys = {};    h.edit = false;   end

        end
        return b
    end
    function c.getKeys(hk)
        return HOTKEY.list[hk].keys == nil and 'nil_'..hk or encodeJson(HOTKEY.list[hk].keys or '{}')
    end
    if not HOTKEY.eventHandlers then
        addEventHandler("onWindowMessage",
            function (message, wparam, lparam)    
                for k,v in pairs(HOTKEY.list) do
                    if v.edit then
                        if message == 0x0102 then--CHAR
                            consumeWindowMessage(true,true)
                        elseif message == 0x0008 then--KILLFOCUS
                            v.edit = false
                            v.keys = {}
                        end
                    end
                end
            end
        )
        lua_thread.create(function()
            while true do wait(0)
            -- addEventHandler('onD3DPresent',function()
                if HOTKEY~=nil then
                    for k,v in pairs(HOTKEY.list) do
                        if HOTKEY.list[k] ~= nil and v.activeOnCursorActive and true or not (sampIsCursorActive() or sampIsDialogActive() or sampIsChatInputActive()) and not v.edit then
                           
                            if v.keyDown and (#v.keys == 1 and isKeyDown(v.keys[1]) or #v.keys == 2 and (isKeyDown(v.keys[1]) and isKeyDown(v.keys[2])) or false) or (#v.keys == 1 and isKeyJustPressed(v.keys[1]) or #v.keys == 2 and (isKeyDown(v.keys[1]) and isKeyJustPressed(v.keys[2])) or false)  then
                                v.callback()
                            end

                        end

                    end
                end
            end
        end)
        HOTKEY.eventHandlers = true
    end

    return c
end
Посмотреть вложение 186596
Посмотреть вложение 186597
Сочетания клавиш нельзя регать(
 

Kvisk

Известный
212
223
Чапо почему нельзя биндить ALT+G и вообще всё что начинается на ALT ?
Че это за позор. Фикси.
И вот это пиздец конечно решение...Посмотреть вложение 186592
Иначе не сохраняется нихуя вообще.
Чтобы пофиксить alt, мне помогло:
Изменить клавишу и добавить условие:
local LargeKeys = {
    VK_SHIFT,
    VK_SPACE,
    VK_CONTROL,
    VK_MENU, -- В место VK_LMENU
    VK_RETURN
}

addEventHandler('onWindowMessage', function(msg, key)
    if msg == 0x0100 or msg == 260 then -- or msg == 260 новое
        ...   
    elseif msg == 0x0101 or msg == 261 then -- or msg == 261 новое
        if HOTKEY.EditKey ~= nil then -- убрал and key ~= VK_LMENU
        ...
    end
end)
ZoSLsyD.png

1j5ZWZm.png
 
Последнее редактирование:

ALCAPONE2225

Известный
39
0
если в функции которую вызывает хоткей есть wait то крашит, в imgui такой проблемы небыло, знает кто как решить?
[ML] (error) script.lua: C:\Games\GTA San Andreas\moonloader\script.lua:32: attempt to yield across C-call boundary
stack traceback:
[C]: in function 'wait'
C:\Games\GTA San Andreas\moonloader\script.lua:32: in function 'callback'
C:\Games\GTA San Andreas\moonloader\lib\mimhotkey.lua:68: in function <C:\Games\GTA San Andreas\moonloader\lib\mimhotkey.lua:60>
 

ALCAPONE2225

Известный
39
0
пробовал так сделать:
Код:
if (#keys == 1 and key == keys[1]) or (#keys == 2 and isKeyDown(keys[1]) and key == keys[2]) then
    lua_thread.create(function()
        data.callback(name)
    end)
end
но крашит из за того что внутри вызванной функции тоже есть потоки, не могу понять как ркейсе это было сделано что все нормально работало..
 

Kvisk

Известный
212
223
пробовал так сделать:
Код:
if (#keys == 1 and key == keys[1]) or (#keys == 2 and isKeyDown(keys[1]) and key == keys[2]) then
    lua_thread.create(function()
        data.callback(name)
    end)
end
но крашит из за того что внутри вызванной функции тоже есть потоки, не могу понять как ркейсе это было сделано что все нормально работало..
Не очень понял что ты хочешь сделать, а вообще
Lua:
lua_thread.create(function(v)
  data.callback(v)
end, name)
-- или так
lua_thread.create(data.callback, name)
 
Последнее редактирование:

AnWu

Известный
Всефорумный модератор
4,772
5,382
пробовал так сделать:
Код:
if (#keys == 1 and key == keys[1]) or (#keys == 2 and isKeyDown(keys[1]) and key == keys[2]) then
    lua_thread.create(function()
        data.callback(name)
    end)
end
но крашит из за того что внутри вызванной функции тоже есть потоки, не могу понять как ркейсе это было сделано что все нормально работало..
я ëбаный гений, бро
 
  • Ха-ха
Реакции: whyega52

Lance_Sterling

Известный
965
337
Э
А что мешает юзать как в имгуи(даже можно в свой код переносить а значит -либа)