Yeni aldığım logitech g300s mouseumda macro özelliğini kullanarak G tuşlarına ses açma ve kısma tuşları atamak istediğimde önceki a4 tech x7 gaming mouseumun yazılımında olan fakat ilginç bir şekilde logitech yazılımında olmayan bir özelliğe rastladım.
A4 tech in sağladığı yazılımda basılı tutarak ses açma ve kısma özellikleri bulunurken logitech yazılımında ses açıp kısmak için her seferinde tuşa basmak zorunda kalıyorsunuz, her basmada 2 şer kez artırıp azalttığına göre sesi 0 dan 100 e çıkarmak için tuşa 50 kez basmanız gerekiyor, saçma bir mekanik.
İngilizce kaynaklarda biraz araştırdıktan sonra bir arkadaşın lua scripti kullanarak bu soruna çözüm bulduğunu gördüm. tabi ki paylaştığı kod direk kopyala yapıştır ile çalışmadı, ufak tefek düzenleme, temizleme yapmak gerekti, lua dilini bilmediğim için biraz üşendim açıkcası, mouseı aldıktan bir kaç hafta sonra kodla uğraşabildim, biraz düzenleyip aşağıdaki şekilde çalıştırmayı başardım.
Aşağıdaki kodu direk olarak kod ekranındaki kodla değiştirip kaydet (ctrl+s) yaptığınızda logitech g300s mouseunuzun sağda bulunan 2 tuşuna yani g7 ve g6 tuşlarına ses açıp kısma özelliği kazandıracaktır. atama işlemi kodla yapılacağından bu tuşlarda herhangi bir komut varsa atamasını kaldırın, yoksa hem ses açma/kısmaya çalışıp hem de atanan komutu uygulamaya çalışıp buglu çalışacaktır.
Kod ekranını açmak için logitech gaming software üzerinde uygulamak istediğiniz profile sağ tıklayıp komut düzenleyicisini göster diyin, açılan ekrandaki kodları silip paylaştığım kodları yapıştırın ve kaydedin. ayrıca bu ekranı açmak için genel modu değil, oyun algılama modunu kullanarak ayar yapmanız gerekiyor, sadece bu şekilde kod yazılabiliyor. oyun dışında da çalışsın istiyorsanız varsayılan profin üzerinde kodu kullanabiliyorsunuz.
Kodla ilgili ufak bir hata var, bu kodları kullandığınızda mod değiştirme işlemi yapamıyorsunuz, her zaman seçili üst moddan en üsttekine dönüyor. Ben zaten tek mod kullandığım için bu hataya fazla takılmadım, fakat uğraşmak isteyen varsa çözebileceğini düşünüyorum, sanırım her profil için ayrı ayrı tanımlama yapılmadığından sürekli ilk profili seçiyor.
Altta paylaştığım kodu oluşturmak için buradaki yazıdan faydalandım (i used this post at the link to generate this piece of code, i thank the person who wrote it) https://forums.logitech.com/t5/Scripting-and-SDK/Volume-Up-Down-in-Lua/m-p/1278108#M470
function fn_Rep(event, num, family, delay, ...) local t = "Rep" .. family .. num if event == "G_PRESSED" or event == "MOUSE_BUTTON_PRESSED" then if TaskRunning(t) then AbortTask(t) end RunTask(t, t_Rep, delay, ...) elseif event == "G_RELEASED" or event == "MOUSE_BUTTON_RELEASED" then StopTask(t) end end function t_Rep(delay, ...) local t1, t2 = 20, delay - 20 if t2 < 0 then t1, t2 = delay / 2, delay - delay / 2 end local f = true while f do PressKey(...) f = TaskSleep(t1) ReleaseKey(...) f = f and TaskSleep(t2) end return -1 end -- G300S Mouse Bindings G300S = {[0] = {}} G300S[1] = { --[1] = nil, -- left button --[2] = nil, -- right button --[3] = "mb2", -- middle (wheel) button --[4] = "mb4", -- G4 --[5] = "mb5", -- G5 [6] = {fn_Rep, 50, 0x12e}, [7] = {fn_Rep, 50, 0x130}, } Map = { ["mouse"] = G300S, } -- everything below this line is "framework" code and shouldn't normally be changed function OnEvent(event, arg, family) local st = StateTimer if event == "G_PRESSED" or event == "MOUSE_BUTTON_PRESSED" then local mode = GetMKeyState(family) local map = Map[family][mode] or {} local action = map[arg] local t = type(action) if t == "function" then action(event, arg, family) elseif t == "table" then local f = action[1] if type(f) == "function" then f(event, arg, family, unpack(action, 2)) else PressKey(unpack(action)) end elseif t == "string" or t == "number" then PressKey(action) end Map[family][0][arg] = action elseif event == "G_RELEASED" or event == "MOUSE_BUTTON_RELEASED" then local map = Map[family][0] local action = map[arg] local t = type(action) if t == "function" then action(event, arg, family) elseif t == "table" then local f = action[1] if type(f) == "function" then f(event, arg, family, unpack(action, 2)) else ReleaseKey(unpack(action)) end elseif t == "string" or t == "number" then ReleaseKey(action) end map[arg] = nil elseif event == "PROFILE_ACTIVATED" then EnablePrimaryMouseButtonEvents(true) InitPolling() elseif event == "PROFILE_DEACTIVATED" then ReleaseAllKeys() end DoTasks() Poll(event, arg, family, st) end POLL_FAMILY = "mouse" -- current mice don't have M-states, so this is a good choice POLL_INTERVAL = 10 -- delay (in milliseconds) before next loop, used to throttle polling rate POLL_DEADTIME = 100 -- settling time (in milliseconds) during which old poll events are drained function InitPolling() ActiveState = GetMKeyState_Hook(POLL_FAMILY) SetMKeyState_Hook(ActiveState, POLL_FAMILY) end function Poll(event, arg, family, st) if st == nil and StateTimer ~= nil then return end local t = GetRunningTime() if family == POLL_FAMILY then if event == "M_PRESSED" and arg ~= ActiveState then if StateTimer ~= nil and t >= StateTimer then StateTimer = nil end if StateTimer == nil then ActiveState = arg end StateTimer = t + POLL_DEADTIME elseif event == "M_RELEASED" and arg == ActiveState then Sleep(POLL_INTERVAL) SetMKeyState_Hook(ActiveState, POLL_FAMILY) end end end GetMKeyState_Hook = GetMKeyState GetMKeyState = function(family) family = family or "kb" if family == POLL_FAMILY then return ActiveState else return GetMKeyState_Hook(family) end end SetMKeyState_Hook = SetMKeyState SetMKeyState = function(mkey, family) family = family or "kb" if family == POLL_FAMILY then if mkey == ActiveState then return end ActiveState = mkey StateTimer = GetRunningTime() + POLL_DEADTIME end return SetMKeyState_Hook(mkey, family) end -- Task Management functions TaskList = {} function DoTasks() local t = GetRunningTime() for key, task in pairs(TaskList) do if t >= task.time then local s, d = coroutine.resume(task.task, task.run) if (not s) or ((d or -1) < 0) then TaskList[key] = nil else task.time = task.time + d end end end end function RunTask(key, func, ...) AbortTask(key) local task = {} task.time = GetRunningTime() task.task = coroutine.create(func) task.run = true local s, d = coroutine.resume(task.task, ...) if (s) and ((d or -1) >= 0) then task.time = task.time + d TaskList[key] = task end end function StopTask(key) local task = TaskList[key] if task ~= nil then task.run = false end end function AbortTask(key) local task = TaskList[key] if task == nil then return end while true do local s, d = coroutine.resume(task.task, false) if (not s) or ((d or -1) < 0) then TaskList[key] = nil return end end end function TaskRunning(key) local task = TaskList[key] if task == nil then return false end return task.run end function TaskSleep(delay) return coroutine.yield(delay) end -- PressKey / ReleaseKey enhancements -- if PressKey is called n times for a key, don't release until ReleaseKey has been called n times -- allow arguments to be tables -- release keys in reverse order of how they were pressed -- allow "_", "^" and "@" prefixes for key-specific Shift, Ctrl and Alt modifiers -- allow "mb1" through "mb5" for mouse buttons MODIFIER_PREDELAY = 20 -- 20ms delay to allow Shift, Ctrl or Alt to register MODIFIER_POSTDELAY = 10 -- 10ms delay before releasing Shift, Ctrl or Alt KeyCounts = {} PressKey_Hook = PressKey PressKey = function(...) local n = select("#", ...) for i = 1, n do local arg = select(i, ...) if type(arg) == "table" then PressKey(unpack(arg)) elseif arg ~= nil then local fShift, fCtrl, fAlt local c = string.sub(arg, 1, 1) while c == "_" or c == "^" or c == "@" do if c == "_" then fShift = true elseif c == "^" then fCtrl = true else fAlt = true end arg = string.sub(arg, 2) c = string.sub(arg, 1, 1) end c = KeyCounts[arg] or 0 c = c + 1 if c == 1 then if fShift then PressKey_Hook("lshift") end if fCtrl then PressKey_Hook("lctrl") end if fAlt then PressKey_Hook("lalt") end if fShift or fCtrl or fAlt then Sleep(MODIFIER_PREDELAY) end if string.sub(arg, 1, 2) == "mb" then PressMouseButton(string.sub(arg, 3)) else PressKey_Hook(arg) end if fShift or fCtrl or fAlt then Sleep(MODIFIER_POSTDELAY) end if fAlt then ReleaseKey_Hook("lalt") end if fCtrl then ReleaseKey_Hook("lctrl") end if fShift then ReleaseKey_Hook("lshift") end end KeyCounts[arg] = c end end end ReleaseKey_Hook = ReleaseKey ReleaseKey = function(...) local n = select("#", ...) for i = n, 1, -1 do local arg = select(i, ...) if type(arg) == "table" then ReleaseKey(unpack(arg)) elseif arg ~= nil then local c = string.sub(arg, 1, 1) while c == "_" or c == "^" or c == "@" do arg = string.sub(arg, 2) c = string.sub(arg, 1, 1) end c = KeyCounts[arg] or 1 c = c - 1 if c == 0 then c = nil if string.sub(arg, 1, 2) == "mb" then ReleaseMouseButton(string.sub(arg, 3)) else ReleaseKey_Hook(arg) end end KeyCounts[arg] = c end end end function ReleaseAllKeys() for arg, _ in pairs(KeyCounts) do KeyCounts[arg] = nil if string.sub(arg, 1, 2) == "mb" then ReleaseMouseButton(string.sub(arg, 3)) else ReleaseKey_Hook(arg) end end end