Java控制鼠標(biāo)和鍵盤(pán)的方法
背景
幾年前我還在玩艦C的時(shí)候,被艦C頻繁收遠(yuǎn)征的操作給煩透了,后來(lái)搜到了一個(gè)自動(dòng)收遠(yuǎn)征的輔助工具,用了一段時(shí)間,不是一般的輕松。我簡(jiǎn)單研究了一下它的原理和實(shí)現(xiàn)方式,大概是通過(guò)識(shí)別出各個(gè)按鈕圖片的位置并模擬鼠標(biāo)點(diǎn)擊來(lái)操作的,Java也可以通過(guò)編碼來(lái)控制鍵盤(pán)和鼠標(biāo),本文將介紹Java里操作鍵盤(pán)鼠標(biāo)的兩種方式,并且會(huì)運(yùn)用在某游戲的自動(dòng)練級(jí)上。
Robot類(lèi)
Java的Robot類(lèi)提供了很多方法,包含了鼠標(biāo)鍵盤(pán)以及屏幕的一些通用操作,一般用于自動(dòng)化測(cè)試或者其他相關(guān)的場(chǎng)景中,下面是幾個(gè)示例
一、獲取鼠標(biāo)當(dāng)前的位置

二、模擬鼠標(biāo)點(diǎn)擊和鍵盤(pán)按鍵
Robot robot = new Robot();
robot.mouseMove(100, 100);
robot.keyPress(KeyEvent.VK_CONTROL);
robot.keyPress(KeyEvent.VK_SHIFT);
robot.keyPress(KeyEvent.VK_ESCAPE);
robot.keyRelease(KeyEvent.VK_ESCAPE);
robot.keyRelease(KeyEvent.VK_SHIFT);
robot.keyRelease(KeyEvent.VK_CONTROL);
上面是移動(dòng)鼠標(biāo)以及模擬按鍵(示例中的按鍵是打開(kāi)任務(wù)管理器)的代碼。
在高分辨率(2k或者4k分辨率)下,java的robot相關(guān)類(lèi)獲取到的屏幕位置、鼠標(biāo)位置等數(shù)值均不準(zhǔn)確,需要對(duì)數(shù)值乘上一個(gè)固定的數(shù)值。
如果通過(guò)這個(gè)功能做一個(gè)輔助工具,需要滿(mǎn)足這樣的條件:鼠標(biāo)點(diǎn)擊的位置必須是固定的,否則就需要人工調(diào)整位置或者縮放,我找了一張少女前線(xiàn)的活動(dòng)圖來(lái)測(cè)試,編碼思路如下:
需要錄制鼠標(biāo)點(diǎn)擊位置以及間隔時(shí)間的程序,并輸出這些數(shù)值
讀取上一步輸出的數(shù)值,調(diào)用對(duì)應(yīng)的鼠標(biāo)點(diǎn)擊方法
下面是我最終的編碼結(jié)果(未包含錄制鼠標(biāo)點(diǎn)擊的程序)

這樣每天的刷活動(dòng)物資的任務(wù)就可以交給這個(gè)程序了。
等到活動(dòng)結(jié)束后,我還想利用它進(jìn)行練級(jí)等操作,僅僅靠鼠標(biāo)移動(dòng)點(diǎn)擊是不能滿(mǎn)足要求了,我找到了sikuli這個(gè)框架。
Sikuli
sikuli也是一個(gè)自動(dòng)化框架,它的一個(gè)優(yōu)點(diǎn)是可以傳入圖片或者文字,能夠直接定位到圖片或者文字在屏幕上的位置,我就又重構(gòu)了一下。考慮到少前操作的一些特點(diǎn),我簡(jiǎn)單設(shè)計(jì)了一個(gè)腳本:

腳本支持等待和點(diǎn)擊某個(gè)元素、睡眠指定時(shí)間、條件操作等等。我將圖片放入指定的目錄,腳本中只需要寫(xiě)圖片的文件名就行了。
腳本還支持引用別的腳本:

下面是腳本解析和執(zhí)行的部分代碼:

總結(jié)
本文簡(jiǎn)單介紹了Java的兩種控制鼠標(biāo)鍵盤(pán)的方法,通過(guò)這些,可以實(shí)現(xiàn)部分游戲的自動(dòng)化重復(fù)操作,比如少女前線(xiàn)的練級(jí)、刷資源等等。Java有些不足的地方是,在程序運(yùn)行的過(guò)程中,電腦是不能做其他操作的,否則就會(huì)影響程序正常運(yùn)行,不過(guò)對(duì)我來(lái)說(shuō),這已經(jīng)足夠了。