1. в коллбеке проверяй открытие чатаЕсть проблема. Забинженнная кнопка реагирует даже тогда, когда набираешь текст в чат. (Пишешь что нибудь и нажал кнопку а на ней бинд и происходит действие).
Будет ли возможность задействовать кнопки мыши для бинда?
а что про альт и т.п. клавиши? с ними ток сочетание клавиш биндится. приходится делать бинд по ид или названию клавиш1. в коллбеке проверяй открытие чата
2. скорее всего нет
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
Сочетания клавиш нельзя регать(Посмотреть вложение 186596Lua: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
Посмотреть вложение 186597
Чтобы пофиксить alt, мне помогло:Чапо почему нельзя биндить ALT+G и вообще всё что начинается на ALT ?
Че это за позор. Фикси.
И вот это пиздец конечно решение...Посмотреть вложение 186592
Иначе не сохраняется нихуя вообще.
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)
[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>
Создай потокесли в функции которую вызывает хоткей есть wait то крашит, в imgui такой проблемы небыло, знает кто как решить?
пробовал так сделать:Создай поток
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
Не очень понял что ты хочешь сделать, а вообщепробовал так сделать:
но крашит из за того что внутри вызванной функции тоже есть потоки, не могу понять как ркейсе это было сделано что все нормально работало..Код: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_thread.create(function(v)
data.callback(v)
end, name)
-- или так
lua_thread.create(data.callback, name)
через какое то время "cannot resume non-suspended coroutine" выдает, на imgui все нормально работаетНе очень понял что ты хочешь сделать, по пробуй так
я ëбаный гений, бропробовал так сделать:
но крашит из за того что внутри вызванной функции тоже есть потоки, не могу понять как ркейсе это было сделано что все нормально работало..Код: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