前言
我們的鼠标在進入最近十年後,迅速的發展,鼠标性能的提高,方案的多樣化,使得鼠标在完成本身功能的前提下,能提供更多的按鍵和自定義的功能。
你如果是FPS玩家一定是聽說過有一種東西叫做宏,它如同外挂軟件一樣可以讓AK和M4一樣穩定,那麼宏是不是外挂,宏實現的遠離,我們如果要編寫宏要怎麼操作?這次,我就來說一說宏是什麼,它怎麼實現的,它又是怎麼用的。
什麼是宏
宏是什麼,目前來說大家說的宏(Macro),其實就算是一種腳本以及執行器,百度百科的說法是,計算機科學裡的宏是一種抽象,它根據一系列預定義的規則替換一定的文本模式,那麼這句話是什麼意思呢?大緻就是說,比如今天我定義UP 4這一段話是鼠标向上移動4個像素,那麼我在一個文檔裡面寫這句話,程序讀取文檔中這句就會讓鼠标向上移動4個像素點
這會兒寫的這個文本就是腳本(Script),這裡的腳本就是宏(Macro)了,他們的意思是一樣的,就像菠蘿和鳳梨(閩南話讀菠蘿的發音)
宏是怎麼實現的
宏的實現離不開軟件的支持,鼠标驅動實際上是符合USB協議的,像是鼠标鍵盤搖杆等HID設備在如今和以前的USB下是免驅的,而控制軟件可以通過鼠标鍵盤配合驅動程序,實現我們需要的各類功能
剛剛有說,鼠标鍵盤的宏的實現,無非就是軟件而已,控制軟件可以通過間接調用驅動程序達到目的,比如上一段中說的讓指針移動4個像素,因為設備性能的提升,我們可以讓鼠标去執行腳本,腳本也可保存到鼠标上,畢竟現在鼠标的存儲空間存這些字符還是很容易的。
當然,也可能有編譯或者文字壓縮,類似僞代碼那樣。
總的來說我個人是覺得有幾種形式,一種,控制軟件本身和驅動程序挂鈎,另一種,控制軟件本身隻和鼠标通信,鼠标代為執行并通過驅動軟件實現。
真正的鼠标宏什麼樣
鼠标宏,其實長得就像是程序代碼那樣,不過它是僞代碼是腳本,比如羅技全線G系列,控制軟件就支持Lua腳本,這是一種非常經常在RPG等遊戲中使用到的腳本語言
我從網上找一個羅技鼠标的壓槍宏,用作本次實例,因為使用XML格式,所以我們可以簡單的打開,圖上這一部分主要是鼠标的配置文件
向下拖動,則會看到腳本的部分,密密麻麻的并不容易查看,因為這部分是交由控制軟件讀取所以就沒有前面部分有依有據的樣子
總的來說,羅技的配置文件在我看來是以三部分組成,按鍵名稱定義,鼠标配置c包括各檔位的DPi,燈的亮度顔色,型号,然後才是腳本
如何寫鼠标宏
鼠标宏,可能很多玩家在被惡心過後,就覺得這東西臭不可聞,不過技術是技術,用在哪裡歸咎于人,自定義按鍵最開始的宣傳點是MMORPG中所用的,比如WOW中技能釋放,可以通過按鍵記錄的方式,一鍵觸發出來,而宏則提供了更高級的形式,釋放後角色自動位移,并且因為是驅動層級所以不會被檢測為外挂,咳咳。
這邊我以G9X設備為例,考慮到軟件成熟度,不選用羅技G HUB控制軟件,使用早期9.0版本的Logitech 遊戲軟件。
正常記錄宏是這樣的,可以實現鍵盤按鍵記錄,可以完成一系列功能,比如輸入密碼,比如一鍵打開浏覽器,等等等,這裡模式是闆載存儲模式
如果是用Lua腳本的宏,就可以實現更複雜的功能,也讓人覺得"這才是宏",下面舉例一段宏,我也會盡量讓所有人理解
function OnEvent(event, arg)
if (event == "PROFILE_ACTIVATED") then
-- profile has been activated
end
end
上面的這一段宏,是在配置文件激活的時候運行,當然這一段什麼功能也沒有執行,他是空的,你如果要執行什麼我們必須要添加一些東西到裡面。
我們來認識一下,常用的一些"事情",在宏文件中是EVENT
G_PRESSED 按下G系列的按鍵,G系列自定義鍵在羅技的鍵盤上有挺多
G_RELEASED G按鍵釋放
M_PRESSED 按下M系列的按鍵
M_RELEASED M系列按鍵釋放
MOUSE_BUTTON_ PRESSED 按下鼠标按鈕
MOUSE_BUTTON_RELEASED 松開鼠标按鈕,也就是你手指擡起的時候
現在我們來寫一個簡單的宏,打開txt文本編輯器,當然我更建議你使用Windows10自帶的代碼編輯器,把這些複制進去。
function OnEvent(event,arg)
if(event == "MOUSE_BUTTON_PRESSED" and arg == 2) then
OutputLogMessage("鼠标按鍵2按下了");
end
end
然後保存文件,做的非常好,你現在已經掌握了如何寫和保存宏了!這可是一大進步
現在,可以打開控制軟件,為了開啟強大的功能我們必須設置為使用PC端控制軟件來實現功能的模式
進入宏編輯界面,新建一個配置文件,因為是實驗所以就先隻在記事本.exe裡面生效
保存後界面如下,我們可以試試把宏導入進去,當然現在還沒到時候
在配置文件圖标處右鍵,第七項,編寫腳本
彈出如下窗口,可以在這裡編輯我們的宏
剛剛不是保存了文本文件嗎,複制過來看看吧
Ctrl S保存宏然後就可以在記事本窗口下實驗了,按動鼠标右鍵,下方會有提示我們設置好的語句。都是問号是正常的因為沒有字庫,我寫的隻是為了方便理解
當然到這你應該明白了,事件要再加上arg這個數值才等于指定的按鈕,比如鼠标事件 按鈕對應的數值,才等于具體是哪個按鈕,鍵盤G按鍵什麼的也是一樣的,鼠标左鍵是1,右鍵是2,中按鍵是3,其他鼠标也是,至于自定義按鍵嘛,這個請自行嘗試了
然後我們可以寫點激動人心的東西,比如來理解下用鼠标宏要怎麼壓槍
使用鼠标宏壓槍
其實,為了保護操作,左鍵是不能綁定腳本的,鼠标必須有一個按鍵必須被設置為左鍵,在剛剛寫腳本的界面你應該也會發現不能讓左鍵被識别。也因此,我們得重新設置一下鼠标
側面的按鍵設置一個按鈕,作為鼠标的左鍵
鼠标左鍵,就随意設置為其他按鍵了
另外為了方便演示,設置畫圖也就是mspaint.exe作為宏應用程序,這個軟件簡直和記事本一樣經典,它的位置在C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Accessories
再然後,要讓左鍵識别,我們要在腳本觸發的時候加上一句
EnablePrimaryMouseButtonEvents(true)
接下來要了解幾段話,下面這一段話是在鼠标當前坐标下相對進行移動的,x是橫向移動,y就是豎向移動
MoveMouseRelative(x,y)
1,我們可以寫一個這樣的宏,每次點擊鼠标左鍵就可以讓鼠标的坐标向下移動一段距離,下面這一段複制到編輯器裡面可以直接看到效果
function OnEvent(event, arg)
if (event == "PROFILE_ACTIVATED") then
EnablePrimaryMouseButtonEvents(true) --加上這句後,左鍵也可以随便觸發腳本
elseif event == "PROFILE_DEACTIVATED" then
IsOnClick = false
end
if(event == "MOUSE_BUTTON_PRESSED" and arg == 1) then
MoveMouseRelative(0, 4) –每次點擊左鍵向下移動4單位
end
end
2,擴展一下,按住鼠标左鍵的時候,坐标會自動向下,松開左鍵的時候,停止,這樣一個簡單的壓槍宏就完成了
function OnEvent(event, arg)
if (event == "PROFILE_ACTIVATED") then
EnablePrimaryMouseButtonEvents(true)
elseif event == "PROFILE_DEACTIVATED" then
IsOnClick = false --這是記錄按鍵按下了沒有的,一開始是沒有
end
if(event == "MOUSE_BUTTON_PRESSED" and arg == 1) then
IsOnClick = not IsOnClick --按下的時候,翻轉一下,false變true
AK() --這是壓槍的函數
end
if (event == "MOUSE_BUTTON_RELEASED" and arg == 1) then
IsOnClick = false
OutputLogMessage("Release")
end
end
function AK()
repeat
if (IsMouseButtonPressed(1)) then --如果鼠标左鍵按下了,就執行向下移動2.5個位置的語句
MoveMouseRelative(0, 2.5)
Sleep(30)
end
until(not IsOnClick) –按鍵沒按下,退出
end
随便加的圖
3,再擴展一下,随着按下時間的變化,移動坐标的幅度也變化,我想你們也不會去看,直接複制然後試試就行了
function OnEvent(event, arg)
if (event == "PROFILE_ACTIVATED") then
EnablePrimaryMouseButtonEvents(true)
elseif event == "PROFILE_DEACTIVATED" then
IsOnClick = false
end
if(event == "MOUSE_BUTTON_PRESSED" and arg == 1) then
IsOnClick = not IsOnClick --用于記錄鼠标按下
AK()
end
if (event == "MOUSE_BUTTON_RELEASED" and arg == 1) then
IsOnClick = false --松開按鍵的時候,讓向下移動的宏失效
OutputLogMessage("Release")
end
end
function AK()
ShotTime = 0 --這裡是左鍵一直按着的時間
repeat
if (IsMouseButtonPressed(1)) then
if ShotTime <480 then --時間小于480個單位的時候,向下移動2.5個位置
MoveMouseRelative(0, 2.5)
elseif ShotTime < 2400 then --如果大于480單位,但是小于2400單位的時候,移動4.5個位置,增大幅度
MoveMouseRelative(0, 4.5)
else --其他時候,比如時間大于2400單位就移動5.5個位置
MoveMouseRelative(0, 5.5)
end
end
ShotTime = ShotTime 30
Sleep(30)
until(not IsOnClick)
end
如果要開關,也就是說,有時候要用有時候不要用壓槍宏,那我們就設置一個側面的按鍵用于解決這個問題,它就用來啟用或者禁用宏
function OnEvent(event, arg)
if (event == "PROFILE_ACTIVATED") then
EnablePrimaryMouseButtonEvents(true)
MacroState = false --用于開關壓槍宏
elseif event == "PROFILE_DEACTIVATED" then
IsOnClick = false
end
if(event == "MOUSE_BUTTON_PRESSED" and arg == 1) then
IsOnClick = not IsOnClick --用于記錄鼠标按下
AK()
end
if (event == "MOUSE_BUTTON_RELEASED" and arg == 1) then
IsOnClick = false --松開按鍵的時候,讓向下移動的宏失效
end
if (event == "MOUSE_BUTTON_PRESSED" and arg == 5) then
--當你按下側邊按鍵時候,切換宏啟用的開關,從而控制壓槍的啟動的停用
if not MacroState then
OutputLogMessage("Switch Macro On")
MacroState = not MacroState
else
OutputLogMessage("Switch Macro Off")
MacroState = not MacroState
end
end
end
function AK()
ShotTime = 0 --這裡是左鍵一直按着的時間
repeat
if (IsMouseButtonPressed(1) and MacroState) then --如果按鍵按下了,并且壓槍宏開關是開的時候則執行
if ShotTime <480 then --時間小于480個單位的時候,向下移動2.5個位置
MoveMouseRelative(0, 2.5)
elseif ShotTime < 2400 then --如果大于480單位,但是小于2400單位的時候,移動4.5個位置,增大幅度
MoveMouseRelative(0, 4.5)
else --其他時候,比如時間大于2400單位就移動5.5個位置
MoveMouseRelative(0, 5.5)
end
end
ShotTime = ShotTime 30 --左鍵按下的持續時間在這變化,這要依據暫停時間進行修改
Sleep(30)
until(not IsOnClick) --鼠标已經擡起了,退出
end
如何切換槍械,對應不同的槍?這個融會貫通一下就行了吧,我就不寫了
總結
羅技宏用的是Lua腳本,本身編寫難度和可讀性我個人是覺得還不錯,當然了,如果你從未接觸過代碼和腳本,那是有很大難度的,至少從第一句開始就會頭疼,這很正常,如果你看了後理解了,那恭喜你,你在我的想法中應該是屬于2%的人群,是的,我覺得能看懂的隻有2%
可能你到這裡還有一些疑問,比如這裡的這種宏是不是外挂,宏當然是外挂,宏本來就屬于在執行外部程序,當然這比那些純軟件的比如D3D覆蓋UI繪制透視框的,還有讀取内存地址的非内存挂來說,可能更高級一點,它一定程度來說是硬件外挂,是通過驅動程序執行的。
感謝觀看
,更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!